0

ıデータベースを挿入、更新するsqliteを使用してアプリケーションを作成しています。dbを挿入および更新している間。アプリがCursorIndexOutOfBoundsExceptionをスローしました。カーソルについてですが、助けてくれる人はいますか?

public void EntryGiris(int yilsql, String aysql, int bakicisql,
        int krediArabasql, int krediOgrenimsql, int krediTatilsql,
        int faturaElektriksql, int faturaSusql, int faturaInternetsql,
        int aidatsql, int kaskoSigortasql) {

    ContentValues cv = new ContentValues();
    cv.put(C_YIL, yilsql);
    cv.put(C_AY, aysql);
    cv.put(C_BAKICI, bakicisql);
    cv.put(C_KREDIARABA, krediArabasql);
    cv.put(C_KREDIOGRENIM, krediOgrenimsql);
    cv.put(C_KREDITATIL, krediTatilsql);
    cv.put(C_FATURAELEKTRIK, faturaElektriksql);
    cv.put(C_FATURASU, faturaSusql);
    cv.put(C_FATURAINTERNET, faturaInternetsql);
    cv.put(C_AIDAT, aidatsql);
    cv.put(C_KASKOSIGORTA, kaskoSigortasql);

    String[] selectionArgs=new String[]{yilsql+"", aysql};
    String entryGirisSQL="SELECT c_id FROM harcamalar WHERE "+C_YIL+"= ? AND "+C_AY+"= ?";
    Cursor cursor=ourDatabase.rawQuery(entryGirisSQL, selectionArgs);
    cursor.moveToFirst();
    if(cursor.moveToLast()){
        int index=cursor.getInt(cursor.getColumnIndex(C_ID));
        if(index>=0)
            ourDatabase.update(DB_TABLE, cv, C_ID+"="+index, null);
        else ourDatabase.insert(DB_TABLE, null, cv);
    }

}

ここに例外があります:

12-28 10:59:11.967: E/AndroidRuntime(317): FATAL EXCEPTION: main
12-28 10:59:11.967: E/AndroidRuntime(317): android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 0
12-28 10:59:11.967: E/AndroidRuntime(317):  at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
12-28 10:59:11.967: E/AndroidRuntime(317):  at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
12-28 10:59:11.967: E/AndroidRuntime(317):  at android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java:84)
12-28 10:59:11.967: E/AndroidRuntime(317):  at com.deitel.btc.TemporaryDatabase.EntryGiris(TemporaryDatabase.java:129)
12-28 10:59:11.967: E/AndroidRuntime(317):  at com.deitel.btc.Butcegiris$1.onClick(Butcegiris.java:59)
12-28 10:59:11.967: E/AndroidRuntime(317):  at android.view.View.performClick(View.java:2408)
12-28 10:59:11.967: E/AndroidRuntime(317):  at android.view.View$PerformClick.run(View.java:8816)
12-28 10:59:11.967: E/AndroidRuntime(317):  at android.os.Handler.handleCallback(Handler.java:587)
12-28 10:59:11.967: E/AndroidRuntime(317):  at android.os.Handler.dispatchMessage(Handler.java:92)
12-28 10:59:11.967: E/AndroidRuntime(317):  at android.os.Looper.loop(Looper.java:123)
12-28 10:59:11.967: E/AndroidRuntime(317):  at android.app.ActivityThread.main(ActivityThread.java:4627)
12-28 10:59:11.967: E/AndroidRuntime(317):  at java.lang.reflect.Method.invokeNative(Native Method)
12-28 10:59:11.967: E/AndroidRuntime(317):  at java.lang.reflect.Method.invoke(Method.java:521)
12-28 10:59:11.967: E/AndroidRuntime(317):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
12-28 10:59:11.967: E/AndroidRuntime(317):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
12-28 10:59:11.967: E/AndroidRuntime(317):  at dalvik.system.NativeStart.main(Native Method)

わかった。ıはあなたが言ったことをしました。しかしその後、ıデバッグアプリケーションはこれをスローします。

Thread [<1> main] (Suspended (exception CursorIndexOutOfBoundsException))   
    Butcegiris$1.onClick(View) line: 75 
    Button(View).performClick() line: 2408  
    View$PerformClick.run() line: 8816  
    ViewRoot(Handler).handleCallback(Message) line: 587 
    ViewRoot(Handler).dispatchMessage(Message) line: 92 
    Looper.loop() line: 123 
    ActivityThread.main(String[]) line: 4627    
    Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]  
    Method.invoke(Object, Object...) line: 521  
    ZygoteInit$MethodAndArgsCaller.run() line: 868  
    ZygoteInit.main(String[]) line: 626 
    NativeStart.main(String[]) line: not available [native method]  
4

4 に答える 4

3
if(cursor.getCount() > 0) {
cursor.moveToPosition(cursor.getCount() - 1);
    Long index=cursor.getLong(cursor.getColumnIndex(C_ID));
    if(index>=0)
            ourDatabase.update(DB_TABLE, cv, C_ID+"="+index, null);
    else ourDatabase.insert(DB_TABLE, null, cv);

}
于 2012-12-28T11:38:29.963 に答える
0

クエリの結果のカーソルには行が含まれていない可能性があります(例のように、結果は空です)。ergocursor.getCount()はを返し0ます。

この場合、インデックスの要素が必要ですが-1、これは常に無効です。これを手作りする代わりに、Cursor.moveToLast()組み込みのメソッドを使用します。このメソッドは別の方法で返すため、結果がどこにあるかを確認することもできますfalse

カーソルを最後の行に移動します。

カーソルが空の場合、このメソッドはfalseを返します。

于 2012-12-28T11:26:16.877 に答える
0

エラーメッセージを注意深く読むと、クエリで結果が得られなかったことがわかります。

于 2012-12-28T11:26:46.270 に答える
0

問題はここにあります:

int index=cursor.getInt(cursor.getColumnIndex(C_ID));

-1はによって返されます

cursor.getColumnIndex(C_ID)

C_IDが作成されているかどうかを確認します。

于 2012-12-28T11:27:30.900 に答える