2011-12-08 63 views
2

我在android開發中使用SQLite。當我使用insert插入一行時,我得到了該行的編號。不過,我想要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); 
} 
+0

請上傳您的完整堆棧跟蹤。 –

+0

哪一個是你的適配器的第89行? – Guillaume

+0

爲了將來的參考,請不要將堆棧跟蹤或代碼作爲註釋發佈,它們不可讀。改爲編輯問題。 – NullUserException

回答

2

從光標DOC:

公共抽象INT getColumnIndex(字符串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

我創建表我們 – CodeBoy

+0

私有靜態最後絃樂DB_CREATE = 「CREATE TABLE」 + DB_ALARM_TABLE \t \t \t + 「(」 + KEY_ID + 「INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,」 \t \t \t + KEY_HOUR +「INT NOT NULL ,「+ KEY_MINUTE +」INT NOT NULL,「 \t \t \t + KEY_REPEAT +」INT NOT NULL「+」)「; – CodeBoy

+0

對不起,我的第一個答案是不正確的,你可以看到我編輯它來解釋你的真實問題 – Guillaume

0
int colId = cur.getColumnIndex(KEY_ID); 

我建議改變這

int colId = cur.getColumnIndexOrThrow(KEY_ID); 

如果列不存在,這似乎是可能的原因(如紀堯姆指出),你會得到更多的信息例外,並且比檢查返回值-1更簡單。

+0

是的..看來我不創建列KEY_ID – CodeBoy

+0

@CodeBoy:不,這不是你的問題,看到我的答案 - 你的問題是,你沒有在你的查詢中選擇KEY_ID,你選擇了last_insert_rowid() – Guillaume