如何编写sqlite查询以获取特定数据?

时间:2019-04-02 15:36:27

标签: android android-sqlite android-cursor

我想获取其用户名用于登录的学生的名字,中间名和姓氏。我已经编写了这段特殊的代码,但是它停止了我的应用程序。

我也同时使用了database.query()和.rawquery()之类的方式。

    Cursor studentData(String userId) {
        SQLiteDatabase db = getWritableDatabase();
        Cursor cursor = db.query(studentTable, new String[] { "First_Name", "Middle_Name", "Last_Name"}, "User_ID=?", new String[] { userId }, null, null, null, null);
//        Cursor cursor = db.rawQuery("select First_Name, Middle_Name, Last_Name from Student_Table where User_ID =?", new String[]{userId});
        String data = cursor.getString(cursor.getColumnIndex("First_Name"));
        db.close();
        return cursor;
    }

我应该在字符串中输入全名。

1 个答案:

答案 0 :(得分:1)

您遇到了许多问题。

  1. 尝试使用String data = cursor.getString(cursor.getColumnIndex("First_Name"));, 将导致错误,因为您没有将光标移动第一行之前,并且尝试访问行 -1 将导致异常(您可能遇到的问题)。

    • 您可以使用各种动作???方法例如moveToFirst,moveToNext(最常见的2种),moveToLast,moveToPosition。
    • 大多数光标移动???如果可以移动,则方法返回true,否则返回false。
  2. 您无法关闭数据库,然后访问游标(如果上述问题已解决,则会发生这种情况)

    • Cursor缓冲行,然后仅在需要时才缓冲。

    • 也就是说,当从查询方法(或rawQuery)中的第一行之前(-1)位置返回游标时,仅当尝试移动时通过Cursor填充CursorWindow(缓冲区)(包括getCount())并获得实际数据。因此数据库必须是打开的。

如果您要使用单个字符串(全名),则可以使用:-

String studentData(String userId) { //<<<<<<<<<< returns the string rather than the Cursor
    SQLiteDatabase db = getWritableDatabase();
    String rv = "NO NAME FOUND"; //<<<<<<<<<< value returned if no row is located
    Cursor cursor = db.query(studentTable, new String[] { "First_Name", "Middle_Name", "Last_Name"}, "User_ID=?", new String[] { userId }, null, null, null, null);
    if (cursor.modeToFirst()) {
        String rv = 
            cursor.getString(cursor.getColumnIndex("First_Name")) +
            " " +
            cursor.getString(cursor.getColumnIndex("Middle_Name")) +
            " " +
            cursor.getString(cursor.getColumnIndex("Last_Name"));
    }
    cursor.close(); //<<<<<<<<<< should close all cursors when done with them
    db.close(); //<<<<<<<<<< not required but would result in an exception if returning a Cursor
    return rv;
}

或替代:-

String studentData(String userId) { //<<<<<<<<<< returns the string rather than the Cursor
    SQLiteDatabase db = getWritableDatabase();
    String rv = "NO NAME FOUND"; //<<<<<<<<<< value returned if no row is located
    Cursor cursor = db.query(studentTable, new String[] { "First_Name"||" "||"Middle_Name"||" "||"Last_Name" AS fullname}, "User_ID=?", new String[] { userId }, null, null, null, null);
    if (cursor.modeToFirst()) {
        String rv = 
            cursor.getString(cursor.getColumnIndex("fullname"));
    }
    cursor.close(); //<<<<<<<<<< should close all cursors when done with them
    db.close(); //<<<<<<<<<< not required but would result in an exception if returning a Cursor
    return rv;
}
  • 基础查询为SELECT First_Name||" "||Middle_Name||" "||LastName AS fullname FROM student_table;,因此您将名称连接为查询的一部分,该查询仅返回一个动态创建的名为 fullname 的列。