Как вернуть все результаты базы данных построчно, используя Курсор - база данных SQLite * Working * - PullRequest
0 голосов
/ 02 апреля 2020

В настоящее время для создания приложения для входа в систему используется база данных SQlite с Android studio. В настоящее время я пытаюсь извлечь данные из базы данных построчно и сравниваю имя пользователя и пароль с введенными именем пользователя и паролем пользователя. Делая это, я хочу найти подходящее имя пользователя и пароль, а затем вывести соответствующую информацию о пользователе.

Я не уверен, что лучший способ для этого. Я использовал курсор, но, похоже, смог вернуть только первые значения в базе данных. Было бы лучше использовать столбец идентификатора, который автоинкрементно, и сравнить значение счетчика с идентификатором в для l oop? Или было бы лучше вывести всю базу данных в массив, а затем использовать значение счетчика для основного действия, чтобы пролистать массив для получения необходимой информации.

Код базы данных:

public class DatabaseHelper extends SQLiteOpenHelper {

public static final String DATABASE_NAME = "BIOSECURE";
public static final String TABLE_NAME = "USER";

public static final String COL_1 = "USERNAME";
public static final String COL_2 = "PASSWORD";
public static final String COL_3 = "FIRSTNAME";
public static final String COL_4 = "SECONDNAME";
public static final String COL_5 = "FINGERPRINT";
public static final String COL_6 = "FACE";

// Basi c база данных

public DatabaseHelper(Context context)
{
    super(context, DATABASE_NAME, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db)
{
    db.execSQL("CREATE TABLE USER ( USERNAME TEXT PRIMARY KEY, PASSWORD TEXT, FIRSTNAME TEXT, SECONDNAME TEXT, FINGERPRINT BLOB, FACE BLOB)");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
    db.execSQL("DROP TABLE IF EXISTS USER");
}
// Inserting into database

public boolean insertUserData (String inputUsername, String inputPassword, String inputFirstName, String inputSecondName)
{
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues cv = new ContentValues();
    cv.put(COL_1, inputUsername);
    cv.put(COL_2, inputPassword);
    cv.put(COL_3, inputFirstName);
    cv.put(COL_4, inputSecondName);
    // contentValues.put(COL_5, inputFingerprint);
    // contentValues.put(COL_6, inputFace);

    long result = db.insert(TABLE_NAME,null, cv);
    db.close();
    return result!= -1;
}

// Not working yet
public Cursor CompareUserData () {

    SQLiteDatabase db = this.getWritableDatabase();

    Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_NAME, null);

    return cursor;

Основной код активности:

                // CHECKING USER LOGIN DETAILS
            Cursor cursor = db.CompareUserData();
            for (count = 0; count<=cursor.getCount();count++)
            {
                if (cursor.moveToPosition(count))
                {
                    if (UsernameInput.getText().toString().equals(cursor.getString(0))&&PasswordInput.getText().toString().equals(cursor.getString(1)))
                    {
                     passUser = cursor.getString(0);
                     passPass = cursor.getString(1);
                     passFirst = cursor.getString(2);
                     passSecond = cursor.getString(3);

                     getUser();
                     getPass();
                     getFirst();
                     getSecond();

                        Toast.makeText(getApplicationContext(), "Successfully logged in", Toast.LENGTH_SHORT).show();
                        LoginValidation();
                    }
                }
            }
            if (count > cursor.getCount())
            {
                Toast.makeText(getApplicationContext(),"Incorrect Username or password",Toast.LENGTH_SHORT).show();
            }

1 Ответ

0 голосов
/ 02 апреля 2020

Курсор используется для итерации по строкам, но будет показывать только одну строку за раз и должен быть перемещен в другую строку, поэтому кажется, что он просто показывает первую строку. Вы вызываете cursor.moveToFirst(), но вы никогда не вызываете никакие другие move*() методы, такие как cursor.moveToNext() или cursor.moveToPosition().

При этом, если вы хотите получить пользователя, который был предоставлен при входе в систему из вашей базы данных, получение всех записей и повторение на самом деле не лучший способ сделать это. Ваш второй запрос (SELECT * FROM user WHERE id =) - правильная идея. Если я правильно понимаю ваши цели, вы хотите вернуть одну строку назад, а затем сравнить детали с этой строкой. Механизмы баз данных существуют для того, чтобы фильтровать данные и возвращать именно то, что вам нужно, не дублируйте их усилия здесь. Скажите ему, какого пользователя id вы хотите, и он вернет вам одного пользователя с этим id.

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