Как получить курсор из номера строки - PullRequest
2 голосов
/ 08 декабря 2011

Я использую SQLite в разработке для Android.Когда я вставляю строку, используя вставку, я получаю номер строки.Тем не менее, я хочу KEY_ID, который является первичным ключом таблицы.Я использовал функцию ниже, но я получил:

Caused by: java.lang.IllegalStateException: get field slot from row 0 col -1 failed
    at android.database.CursorWindow.getLong_native(Native Method)
    at android.database.CursorWindow.getInt(CursorWindow.java:434)
    at android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java:93)
    at winterfarmer.timemama.DataBaseAdapter.insertData(DataBaseAdapter.java:89)
    at winterfarmer.timemama.ManagerActivity.addNewRecord2DB(ManagerActivity.java:106)
    at winterfarmer.timemama.ManagerActivity.addNewRecord(ManagerActivity.java:100)
    at winterfarmer.timemama.ManagerActivity.addNewRecord2DB(ManagerActivity.java:106)
    at winterfarmer.timemama.ManagerActivity.addNewRecord(ManagerActivity.java:100)
    at winterfarmer.timemama.ManagerActivity.setRecordOK(ManagerActivity.java:92)
    at winterfarmer.timemama.ManagerActivity.setRecord(ManagerActivity.java:78)
    at winterfarmer.timemama.ManagerActivity.onActivityResult(ManagerActivity.java:64)
    at android.app.Activity.dispatchActivityResult(Activity.java:3890)
    at android.app.ActivityThread.deliverResults(ActivityThread.java:3511)

Как я могу исправить эту ошибку?

public int insertData(RecordInfo recordInfo) {
    Log.d(TAG, "insertData");

    ContentValues initialValues = new ContentValues();

    initialValues.put(KEY_HOUR, recordInfo.hour);
    initialValues.put(KEY_MINUTE, recordInfo.minute);
    initialValues.put(KEY_REPEAT, recordInfo.repeat);

    long rowId = db.insert(DB_ALARM_TABLE, null, initialValues);
    assert rowId >= 0 : "insertData failed";
    Log.d(TAG, "insertData, rowId = " + rowId);
    Cursor cur = db.rawQuery("SELECT last_insert_rowid() from "
            + DB_ALARM_TABLE, null);
    cur.moveToFirst();
    int colId = cur.getColumnIndex(KEY_ID);
    Log.d(TAG, "insertData, colId = " + colId);
    assert colId >= 0 : "insertData failed";
    return cur.getInt(colId);
}

Ответы [ 2 ]

2 голосов
/ 08 декабря 2011

Из Курсора doc:

public abstract int getColumnIndex (String columnName)

С: Уровень API 1 Возвращает нулевой индекс для данного столбца имя или -1, если столбец не существует. Если вы ожидаете, что столбец существует используйте взамен getColumnIndexOrThrow (String), что сделает ошибку более ясной

Так что это объяснит проблему лучше.

В любом случае, вернемся к вашей актуальной проблеме :

Проблема в том, что KEY_ID не является столбцом результата вашего запроса на выборку (результат не будет называться KEY_ID, даже если значение изначально было получено из столбца KEY_ID). У него будет только один результат столбца, поэтому нет смысла запрашивать индекс столбца. colId будет 0. Вы можете напрямую сделать:

Cursor cur = db.rawQuery("SELECT last_insert_rowid() from "
        + DB_ALARM_TABLE, null);
cur.moveToFirst();
return cur.getInt(0);
0 голосов
/ 08 декабря 2011
int colId = cur.getColumnIndex(KEY_ID);

Я рекомендую изменить это на

int colId = cur.getColumnIndexOrThrow(KEY_ID);

Если этот столбец не существует, что является вероятной причиной (как указал Гийом), вы получите гораздо более информативное исключение, и это проще, чем проверка на возвращаемое значение -1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...