Никогда не входя в cursor.moveToNext () в Android SQLite - PullRequest
1 голос
/ 11 февраля 2020

Я пробую Официальную документацию для Android этой статьи . Создание базы данных, таблицы и вставка данных работает нормально. Но я не могу получить данные из базы данных. Вот фрагмент кода для извлечения данных из таблицы.

public Person searchDataInDB(String personCellString) {
    SQLiteDatabase db = getReadableDatabase();

    // Define a projection that specifies which columns from the database
    // you will actually use after this query.
    String[] projection = {
            PersonTable.COLUMN_NAME_ID,
            PersonTable.COLUMN_NAME_NAME,
            PersonTable.COLUMN_NAME_CELL_NO,
            PersonTable.COLUMN_NAME_ADDRESS
    };

    // Filter results WHERE "cell#" = 'Person Cell #'
    String selection = SQLiteDBHelper.PersonTable.COLUMN_NAME_CELL_NO + " = ?";
    String[] selectionArgs = {"'" + personCellString + "'"};

    // How you want the results sorted in the resulting Cursor
    //  String sortOrder = SQLiteDBHelper.PersonTable.COLUMN_NAME_ID + " DESC";

    Cursor cursor = db.query(
            SQLiteDBHelper.PersonTable.TABLE_NAME,   // The table to query
            null,             // The array of columns to return (pass null to get all)
            selection,              // The columns for the WHERE clause
            selectionArgs,          // The values for the WHERE clause
            null,                   // don't group the rows
            null,                   // don't filter by row groups
            null               // The sort order
    );
    String [] names = cursor.getColumnNames();
    Log.e("SQLiteDB", "cursorCount = " + cursor.getCount() + ", cursorColumnCount = " + cursor.getColumnCount() + ", Column = " + names[0]);

    Person person = null;
    while (cursor.moveToNext()) {
        int id = (int) cursor.getLong(
                cursor.getColumnIndexOrThrow(PersonTable.COLUMN_NAME_ID));
        Log.e("SQLiteDB", "moveToNext id = " + id);
        String name = cursor.getString(
                cursor.getColumnIndexOrThrow(SQLiteDBHelper.PersonTable.COLUMN_NAME_NAME));
        Log.e("SQLiteDB", "moveToNext name = " + name);
        String cellNo = cursor.getString(
                cursor.getColumnIndexOrThrow(SQLiteDBHelper.PersonTable.COLUMN_NAME_CELL_NO));
        Log.e("SQLiteDB", "moveToNext cell = " + cellNo);
        String address = cursor.getString(
                cursor.getColumnIndexOrThrow(SQLiteDBHelper.PersonTable.COLUMN_NAME_ADDRESS));
        Log.e("SQLiteDB", "moveToNext address = " + address);
        person = new Person(id, name, cellNo, address);
    }
    cursor.close();

    return person;
}

Кажется, что мое приложение не входит, пока l oop т.е. while(cursor.moveToNext() Так что этот метод всегда возвращает начальное значение person, которое значение NULL. В результате, первое условие всегда верно из-за кода ниже

Person person = dbHelper.searchDataInDB(personCellString);
     if (person == null) {
          Toast.makeText(mContext, "no such record exists in database!", Toast.LENGTH_LONG).show();
     } else {
         String personDetails = "Name = " + person.getName()
                  + "Cell Number = " + person.getCellNumber()
                  + "Address = " + person.getAddress();
         personDetailsTV.setText(personDetails);
     }

Я использую DB Browser для SQLite, чтобы видеть, что записи успешно добавляются в базу данных.

Что я должен сделать с приведенным выше кодом, чтобы он работал?

1 Ответ

1 голос
/ 11 февраля 2020

Что вы делаете с этим:

String[] selectionArgs = {"'" + personCellString + "'"};

ищет строковое значение personCellString, заключенное в одинарные кавычки, а не фактическое значение строки personCellString.

Удалите одинарные кавычки:

String[] selectionArgs = {personCellString};

Вам не нужно беспокоиться о строковом представлении personCellString в последнем операторе sql, который будет создан и выполнен, что приведет к содержать их, не устанавливая их явно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...