Android Studio: приложение не сохраняется в / чтение из базы данных - PullRequest
0 голосов
/ 07 декабря 2018

Так что мое приложение представляет собой сканер QR-кода.В настоящее время он будет читать QR-код и отображать его обратно пользователю.Я хочу получить его, чтобы сохранить этот результат в базе данных, а затем перейти к чтению из него.В настоящее время это не относится ни к одному из последних двух, и я пытаюсь выяснить, что является причиной проблемы - либо сохранение в базе данных, либо чтение из базы данных.

Код моей базы данных:

public class Database {
    private static final String DATABASE_NAME = "QRCodeScanner";
    private static final int DATABASE_VERSION = 1;
    private static final String TABLE_NAME = "codes";

    private OpenHelper mDbHelper;
    private SQLiteDatabase mDb;
    private final Context dbContext;

    private static final String DATABASE_CREATE =
            "CREATE TABLE " + TABLE_NAME + " (" +
                    "codeid INTEGER PRIMARY KEY AUTOINCREMENT, " +
                    "code TEXT NOT NULL);";

    public Database(Context ctx) {
        this.dbContext = ctx;
    }

    public Database open() throws SQLException {
        mDbHelper = new OpenHelper(dbContext);
        mDb = mDbHelper.getWritableDatabase();
        return this;
    }

    public void close() {
        mDbHelper.close();
    }

    public boolean createUser(String code) {
        ContentValues initialValues = new ContentValues();
        initialValues.put("codes", code);

        return mDb.insert(TABLE_NAME, null, initialValues) > 0;
    }


    public ArrayList<String[]> fetchUser(String code) throws SQLException {

        ArrayList<String[]> myArray = new ArrayList<String[]>();

        int pointer = 0;

        Cursor mCursor = mDb.query(TABLE_NAME, new String[] {"codeid", "code",
                        }, "code LIKE '%" + code + "%'", null,
                null, null, null);

        int codeNameColumn = mCursor.getColumnIndex("code");


        if (mCursor != null){
            if (mCursor.moveToFirst()){
                do {
                    myArray.add(new String[3]);
                    myArray.get(pointer)[0] = mCursor.getString(codeNameColumn);
                    pointer++;
                } while (mCursor.moveToNext());
            } else {
                myArray.add(new String[3]);
                myArray.get(pointer)[0] = "NO RESULTS";
                myArray.get(pointer)[1] = "";
            }
        }

        return myArray;

    }

    public ArrayList<String[]> selectAll() {

        ArrayList<String[]> results = new ArrayList<String[]>();


        int counter = 0;

        Cursor cursor = this.mDb.query(TABLE_NAME, new String[] { "codeid", "codes" }, null, null, null, null, "codeid");

        if (cursor.moveToFirst()) {
            do {
                results.add(new String[3]);
                results.get(counter)[0] = cursor.getString(0);
                counter++;
            } while (cursor.moveToNext());
        }
        if (cursor != null && !cursor.isClosed()) {
            cursor.close();
        }

        return results;
    }


    private static class OpenHelper extends SQLiteOpenHelper {

        OpenHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(DATABASE_CREATE);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
            onCreate(db);
        }
    }
}

И мой основной код Java это.

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

private Button Scan;
private ArrayList<String[]> viewall;
private TextView QR_output;
private IntentIntegrator ScanCode;
private ListView lv;
private ArrayList Search = new ArrayList();
ArrayList<String[]> searchResult;

Database dbh;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // this caused an error on earlier APKs which made the app switch from 17 to 27
    setContentView(R.layout.activity_main);

    // Defines the Scan button
    Scan = findViewById(R.id.Scan);
    // defines the output for text
    QR_output = findViewById(R.id.QR_Output);

    // looks for the user clicking "Scan"
    Scan.setOnClickListener(this);

    ScanCode = new IntentIntegrator(this);
    // Means the scan button will actually do something
    Scan.setOnClickListener(this);

    lv = findViewById(R.id.list);

    dbh = new Database(this);
    dbh.open();

}

public void displayAll(View v){

    Search.clear();
    viewall = dbh.selectAll();
    String surname = "", forename = "";

    for (int count = 0 ; count < viewall.size() ; count++) {
        code = viewall.get(count)[1];
        Search.add(surname + ", " + forename);
    }
    ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
            this,
            android.R.layout.simple_list_item_1,
            Search);

    lv.setAdapter(arrayAdapter);
}




// will scan the qr code and reveal its secrets
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
    if (result != null) {
        // if an empty QR code gets scanned it returns a message to the user
        if (result.getContents() == null) {
            Toast.makeText(this, "This QR code is empty.", Toast.LENGTH_LONG).show();
        } else try {
            // converts the data so it can be displayed
            JSONObject obj = new JSONObject(result.getContents());
            // this line is busted and does nothing
            QR_output.setText(obj.getString("result"));
        } catch (JSONException e) {
            e.printStackTrace();
                String codes = result.getContents();
                boolean success = false;

                success = dbh.createUser(codes);
            // outputs the data to a toast
            Toast.makeText(this, result.getContents(), Toast.LENGTH_LONG).show();
        }
    } else {
        super.onActivityResult(requestCode, resultCode, data);
    }
}

@Override
public void onClick(View view) {
    // causes the magic to happen (It initiates the scan)
    ScanCode.initiateScan();
}

}

1 Ответ

0 голосов
/ 07 декабря 2018

Ваша проблема вполне может быть связана со строкой initialValues.put("codes", code);, поскольку в соответствии с определением вашей таблицы нет столбца с именем коды , скорее имя столбца выглядит как код

Как таковое использование initialValues.put("code", code); вполне может решить проблему.

Addititional

Настоятельно рекомендуется определять и впоследствии использовать константы во всем коде для всех именованных элементов (таблиц, столбцов)., триггеры и т. д.) и, следовательно, значение всегда будет идентичным.

например,

private static final String DATABASE_NAME = "QRCodeScanner";
private static final int DATABASE_VERSION = 1;
private static final String TABLE_NAME = "codes";
public static final String COLUMN_CODEID = "codeid"; //<<<<<<<<< example note making public allows the variable to be used elsewhere
public static final String COLUMN_CODE = "code";   //<<<<<<<<<< another example

private OpenHelper mDbHelper;
private SQLiteDatabase mDb;
private final Context dbContext;

private static final String DATABASE_CREATE =
        "CREATE TABLE " + TABLE_NAME + " (" +
                COLUMN_CODEID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + //<<<<<<<<<<
                COLUMN_CODE + " TEXT NOT NULL);"; //<<<<<<<<<<

........ other code omitted for brevity

public boolean createUser(String code) {
    ContentValues initialValues = new ContentValues();
    initialValues.put(COLUMN_CODE, code); //<<<<<<<<<< CONSTANT USED

    return mDb.insert(TABLE_NAME, null, initialValues) > 0;
}

Вероятно, вы также столкнетесь с меньшим количеством проблем, если не будете использовать жестко закодированные смещения столбцов при извлечении данных из курсора с помощьювместо этого используйте метод Cursor getColumnIndex для предоставления смещения.

например вместо: -

results.get(counter)[0] = cursor.getString(0);

было бы лучше использовать: -

results.get(counter)[0] = cursor.getString(cursor.getColumnIndex(COLUMN_CODEID));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...