Как написать SQL-запрос для получения конкретных данных? - PullRequest
1 голос
/ 02 апреля 2019

Я хочу получить имя, отчество и фамилию учащегося, чей ИД используется для входа в систему. Я написал этот фрагмент кода, но он останавливает мое приложение.

Я также использовал оба способа, такие как 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 Ответ

1 голос
/ 03 апреля 2019

У вас есть ряд проблем.

  1. Попытка использовать String data = cursor.getString(cursor.getColumnIndex("First_Name")); приведет к ошибке, поскольку вы не переместили курсор за пределы ПЕРЕД ПЕРВОЙ СТРОКОЙ и попытка доступа к строке -1 приведет к исключению (вероятная проблема, с которой вы столкнулись).

    • вы можете использовать различныепереехать???методы, например, moveToFirst, moveToNext (2 наиболее распространенных), moveToLast, moveToPosition.
    • Большинство движений курсора ???методы возвращают true, если перемещение можно сделать, иначе false.
  2. Вы НЕ МОЖЕТЕ закрыть базу данных, а затем получить доступ к Курсору (это произошло бы, если бы проблема, о которой говорилось выше, быларешено)

    • Курсор буферизует строки, а затем ТОЛЬКО при необходимости.

    • То есть Курсор, когда возвращается из метода запроса (или rawQuery) в позиции ДО ПЕРВОЙ СТРОКИ (-1), это только когдасделана попытка переместиться через Курсор, заполненный 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;, поэтому вы объединяете имена как часть запроса, который возвращает только одиндинамически создаваемый столбец с именем полное имя .
...