2011-12-08 20 views
2

私はアンドロイド開発でSQLiteを使用しています。挿入を使用して行を挿入すると、行の番号が取得されます。しかし、テーブルの主キーである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

:APIレベル1 は、指定された列 名のゼロベースのインデックスを返し、または:ので

パブリック抽象int型getColumnIndex(文字列COLUMNNAME)

列が存在しない場合は-1あなたは列が が

エラーがより明確になる、代わりにgetColumnIndexOrThrow(String)を使用し存在することが予想される場合はだからそれは、より良い問題を説明するだろう。とにかく

、戻ってあなたの実際の問題へ:

問題はKEY_IDが(結果は値がもともとKEY_IDから来ているにもかかわらず、KEY_ID命名されることはありません、あなたの選択クエリの結果列ではないということですカラム)。列結果は1つだけなので、列インデックスを要求するのは意味がありません。 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

はい..それは私が列を作成していないようです – CodeBoy

+0

@CodeBoy:いいえあなたの問題ではない、私の答えを参照してください - あなたの問題はあなたのクエリでKEY_IDを選択していないことですlast_insert_rowid() – Guillaume

関連する問題