Что возвращает запрос Android Sqlite? - PullRequest
1 голос
/ 06 июня 2019

Я новичок в разработке для Android, так что извините, если это так очевидно. Я сделал базовую систему управления пользователями для практики соединения с БД. Мой регистр активности сбой из-за этого сегмента.

if(Db.getUser(Uid) != null){ //Db is a DatabaseHandler Object 
    Toast.makeText(getApplicationContext(),"Email is Already Used",Toast.LENGTH_SHORT);
    Proceed = false;
}

Это DatabaseHandler.getUser ()

    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 != null)
                cursor.moveToFirst();
            else
                return null; //I explicitly made this statement to return null in case of no match 
            User user = new User(cursor.getString(0),cursor.getString(1), cursor.getString(2));
            // return User
            return user;
        }

Я часто использую django, поэтому я подумал, что Android SQLite также возвращает что-то похожее на пустой QuerySet. Я ошибся? Вместо этого он выдает исключение? Если да, то какой будет наилучшая реализация для цели, которую я пытаюсь достичь?

1 Ответ

2 голосов
/ 06 июня 2019

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 положение столбцов в курсоре не имеет значения.

  • Обратите внимание, что приведенный выше код является принципиальным кодом, он не был протестирован или запущен и поэтому может иметь ошибки.

...