gpt4 book ai didi

java - 如何使用 Cursor 逐行返回所有数据库结果 - SQLite 数据库 *工作*

转载 作者:行者123 更新时间:2023-12-01 17:38:54 26 4
gpt4 key购买 nike

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

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

数据库代码:

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;

主要 Activity 代码:

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

最佳答案

游标用于迭代行,但一次只能显示一行,并且必须移动到另一行,这就是为什么它似乎只显示第一行。您调用 cursor.moveToFirst(),但绝不会调用任何其他 move*() 方法,例如 cursor.moveToNext()光标.moveToPosition().

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

关于java - 如何使用 Cursor 逐行返回所有数据库结果 - SQLite 数据库 *工作*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60997205/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com