有多个行时的 SQLite Select 语句

SQLite Select statement when have multiples rows

我想要 select * 来自 table 比较 3 行和 select return 一个 id,我创建了这个方法:

//UserDAO class

private SQLiteDatabase mDatabase;
private DatabaseHelper mDbHelper;

// irelative code

public Long selectUserLogin(String nickname, String chapter, String password) {
    long id;
    String selectQuery = "SELECT  * FROM " +
            DatabaseHelper.TABLE_USERS + " WHERE " +
            DatabaseHelper.COLUMN_USERS_NICKNAME + " = " + nickname + " AND " +
            DatabaseHelper.COLUMN_USERS_CHAPTER + " = " + chapter + " AND " +
            DatabaseHelper.COLUMN_USERS_PASSWORD + " = " + password;

    Log.e(TAG, selectQuery);
    try {
        Cursor cursor = mDatabase.rawQuery(selectQuery, null);
        if (cursor != null)
            cursor.moveToFirst();

        id = cursor.getLong(cursor.getColumnIndex(DatabaseHelper.COLUMN_USERS_ID));

        return id;
    } catch (Exception e){
        e.printStackTrace();
    }
    return null;
}

已经在我的数据库上创建了昵称=q,章节=Q,密码=qqqqqq

这些是我调用方法来测试他的功能的地方

userDAO.selectUserLogin("q", "Q", "qqqqqq");

我用另一种列出我所有用户的方法进行了检查,我得到了我曾经创建的所有用户。

结果如下:

10-09 01:00:18.298 10978-10978/com.org.feedme.cisvmeeting.activities     D/LeaderFragment: User: [
D/LeaderFragment: [1] 1, h, h, G 
D/LeaderFragment: [2] 2, fkfkdk, fjfkdk, SAO 
D/LeaderFragment: [3] 3, Filipe fila, Fil36
D/LeaderFragment: [4] 4, q, Q, qqqqqq
D/LeaderFragment: [5] 5, glgl, vmlc, GOLGO]

当我试图在 Android 设备监视器上查看我的数据文件夹时,该文件夹是空的,所以如果我无法访问数据库或者我没有正确插入,我会有点困惑。

我 logcat 的一部分,当我尝试调用方法 selectUserLogin:

10-09 00:46:01.198 7745-7745/com.org.feedme.cisvmeeting.activities E/UserDAO: SELECT * FROM users WHERE nickname = q AND chapter = Q AND password = qqqqqq

10-09 00:46:01.208 7745-7745/com.org.feedme.cisvmeeting.activities E/SQLiteLog: (1) no such column: q

10-09 00:46:01.208 7745-7745/com.org.feedme.cisvmeeting.activities W/System.err: android.database.sqlite.SQLiteException: no such column: q (code 1): , while compiling: SELECT * FROM users WHERE nickname = q AND chapter = Q AND password = qqqqqq

编辑:我的 android 设备上只有 运行 我的应用程序!

EDIT_2: 我测试了另一种类似的方法,第二种方法工作正常!

public String selectUser(long id) {
    String selectQuery = "SELECT  * FROM " + DatabaseHelper.TABLE_USERS +
            " WHERE " + DatabaseHelper.COLUMN_USERS_ID + "=" + id ;
    String result = null;
    Log.e(TAG, selectQuery);
    Cursor cursor = mDatabase.rawQuery(selectQuery, null);
    // looping through all rows and adding to list
    if (cursor.moveToFirst()) {
        result = cursor.getString(cursor.getColumnIndex(DatabaseHelper.COLUMN_USERS_NAME));
    }
    return result;
}

您需要用引号将字符串参数括起来,因为您没有使用 selectionArgs(rawQuery 中的第二个参数)。

String selectQuery = "SELECT  * FROM " +
        DatabaseHelper.TABLE_USERS + " WHERE " +
        DatabaseHelper.COLUMN_USERS_NICKNAME + " = '" + nickname + "' AND " +
        DatabaseHelper.COLUMN_USERS_CHAPTER + " = '" + chapter + "' AND " +
        DatabaseHelper.COLUMN_USERS_PASSWORD + " = '" + password + "' ";

Log.e(TAG, selectQuery);
try {
    Cursor cursor = mDatabase.rawQuery(selectQuery, null);

或者您可以这样做,它会为您处理字符串。

String selectQuery = "SELECT  * FROM " +
        DatabaseHelper.TABLE_USERS + " WHERE " +
        DatabaseHelper.COLUMN_USERS_NICKNAME + "=? AND " +
        DatabaseHelper.COLUMN_USERS_CHAPTER + "=? AND " +
        DatabaseHelper.COLUMN_USERS_PASSWORD + "=? ";

String[] selectionArgs = new String[] { nickname, chapter, password };

Log.e(TAG, selectQuery);
try {
    Cursor cursor = mDatabase.rawQuery(selectQuery, selectionArgs);

首先,您在设备上删除您的应用程序,然后重新安装该应用程序,现在插入您需要的数据,现在无论您输入的数据是什么,都会记住并将这些数据应用到 select 的查询参数中。