SQLite также возвратил что-то похожее на пустой QuerySet.Я не прав?
Метод запроса возвращает курсор.Это можно описать как Пробел , возможно (пусто, когда метод getCount Курсора вернет 0, т.е. не извлеченные данные), но не null .
.бросить исключение вместо?
Если вы попытаетесь прочитать данные, когда курсор расположен в перед первой строкой (начальная позиция) или послепоследняя строка , тогда вы получите исключение.То есть вы можете читать данные только тогда, когда курсор находится в существующей строке.
Issue
Короче говоря, ваша проблема заключается в том, что вы не проверяете, существует ли строка, так как курсор будетnot be null.
Объяснение
Метод query возвращает курсор, который будет содержать количество строк, каждая из которых состоит из столбцов, указанных в запросе..
Курсор, возвращенный из метода query , никогда не будет нулевым (поэтому проверка на нулевое значение ничего не делает (ваша первая проблема)).Тем не менее, курсор может быть пустым.Таким образом, вам нужно справиться с этой ситуацией.
Чтобы проверить, вернул ли курсор какие-либо строки, вы можете проверить количество строк, используя метод курсора getCount , например, if (cursor.getCount() > 0) { ... get data from row .. } else { ... handle no rows ... }
Альтернативно многие из методов move?????
Курсора возвращают логическое значение, истинное, если движение может быть сделано, или ложное, если нет.например, if (moveToFirst()) { ... get data from row .. } else { ... handle no rows ... }
.
Вы можете просмотреть все возвращенные строки с помощью while (cursor.moveToNext () {... получить данные из текущей строки ..};
Исправление
Если да, то какой будет наилучшая реализация для цели, которую я пытаюсь достичь?
- Обратите внимание, что лучше всего спорить
Кактакой ваш код, где вы хотите получить строку, создать и вернуть одного пользователя (должна быть только одна строка, соответствующая Uid (при условии, что столбец явно или неявно определен с ограничением UNIQIUE)) может быть: -
User getUser(String Uid) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_UID,
KEY_NAME, KEY_PASS }, KEY_UID + "=?",
new String[] { Uid }, null, null, null, null);
if (cursor.moveToFirst()) {
return new User(cursor.getString(csr.getColumnIndex(KEY_UID),cursor.getString(cursor.getColumnIndex(KEY_NAME)),cursor.getString(cursor.getColumnIndex(KEY_PASS));
} else
return null; //I explicitly made this statement to return null in case of no User
}
Обратите внимание, что использование getColumnIndex (the_column_name) уменьшает вероятность ошибок при определении смещения столбца, например,
, если вы по неосторожности использовали db.query(TABLE_CONTACTS, new String[] { KEY_UID, KEY_PASS, KEY_NAME }, KEY_UID + "=?", new String[] { Uid }, null, null, null, null);
, то при использовании результирующих смещений результирующего пользователя в качестве имени будет использоваться пароль, а в качестве пароля - имя. При использовании getColumnIndex положение столбцов в курсоре не имеет значения.
Обратите внимание, что приведенный выше код является принципиальным кодом, он не был протестирован или запущен и поэтому может иметь ошибки.