【问题标题】:How to return all database results row by row using Cursor - SQLite database *Working*如何使用光标逐行返回所有数据库结果 - SQLite 数据库*工作*
【发布时间】:2023-03-09 16:46:01
【问题描述】:

目前使用带有 Android Studio 的 SQlite 数据库来构建登录应用程序。我目前正在尝试逐行从数据库中检索数据,并将用户名和密码与用户的输入用户名和密码进行比较。这样做我想找到匹配的用户名和密码,然后输出相应的用户信息。

我不确定最好的方法是什么。我使用了游标,但似乎只能返回数据库中的第一个值。最好使用自动递增的 ID 列并将计数值与 for 循环中的 ID 进行比较?或者最好将整个数据库输出到一个数组中,然后在主活动上使用一个计数值来梳理数组以获得必要的信息。

数据库代码:

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";

// 基础数据库

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();
            }

【问题讨论】:

    标签: java android sqlite


    【解决方案1】:

    游标用于遍历行,但一次只会显示一行,并且必须移动到不同的行,这就是为什么它似乎只显示第一行的原因。你调用cursor.moveToFirst(),但你从不调用任何其他move*()方法,比如cursor.moveToNext()cursor.moveToPosition()

    也就是说,如果您想从数据库中获取登录所提供的用户,那么获取所有记录并进行迭代确实不是最好的方法。您的第二个查询 (SELECT * FROM user WHERE id =) 是正确的想法。如果我正确理解了您的目标,您希望获得一排,然后对照该排检查详细信息。数据库引擎的存在是为了过滤数据以返回你想要的,不要在这里重复它的努力。告诉它你想要什么用户id,它会给你一个id的用户。

    【讨论】:

    • 我只添加了 ID 以允许循环返回数据。我的目的是将用户输入的用户名和密码与数据库进行比较。如果用户名和密码匹配数据库中的记录,它会将所有用户信息返回给各个变量以供更改使用。
    • 在这种情况下,只需参考我的答案的第一部分,它并不完整,但会为您指明正确的方向。您需要使用随游标提供给您的迭代器来浏览游标提供的结果行。
    • 我解决了这个问题。在 cursor.movetoposition(count) 旁边使用 for count 循环就可以了。感谢您的帮助!
    • 如果您想帮助遇到同样问题的其他人,您可以随时添加您赢得的答案并将其标记为已接受,并使用代码示例显示您所做的事情!
    • 发布答案后,赞成/反对按钮附近会出现一个复选标记图标。单击以将答案标记为已接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多