0

次のプログラム コードでCursorIndexOutofBoundexceptionは、アプリの実行中に logcat に a が表示されます。Plsは私に解決策を教えてください。

public String getContact(String datevalue,String Userselectvalue) {
        String selection = classdbOpenHelper.KEY_DESC + " = 'Userselectvalue'"  
                +" AND " + classdbOpenHelper.KEY_DATE + " = 'datevalue'";
        SQLiteDatabase db = this.getReadableDatabase(); 
        Cursor cursor = db.query(classdbOpenHelper.DATABASE_TABLE, 
                new String[] {classdbOpenHelper.KEY_EVENT }, selection, 
                null, null, null, null);
             String  place = cursor.getString( );
        return place;
    }

ログキャット:

08-05 11:21:13.327: E/AndroidRuntime(827): FATAL EXCEPTION: main
08-05 11:21:13.327: E/AndroidRuntime(827): android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 0
08-05 11:21:13.327: E/AndroidRuntime(827):  at android.database.AbstractCursor.checkPosition(AbstractCursor.java:424)
08-05 11:21:13.327: E/AndroidRuntime(827):  at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
08-05 11:21:13.327: E/AndroidRuntime(827):  at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
08-05 11:21:13.327: E/AndroidRuntime(827):  at example.showevent1.classdbOpenHelper.getContact(classdbOpenHelper.java:59)
08-05 11:21:13.327: E/AndroidRuntime(827):  at example.showevent1.FirstActivity$getclicker.onClick(FirstActivity.java:163)
08-05 11:21:13.327: E/AndroidRuntime(827):  at android.view.View.performClick(View.java:4204)
08-05 11:21:13.327: E/AndroidRuntime(827):  at android.view.View$PerformClick.run(View.java:17355)
08-05 11:21:13.327: E/AndroidRuntime(827):  at android.os.Handler.handleCallback(Handler.java:725)
08-05 11:21:13.327: E/AndroidRuntime(827):  at android.os.Handler.dispatchMessage(Handler.java:92)
08-05 11:21:13.327: E/AndroidRuntime(827):  at android.os.Looper.loop(Looper.java:137)
08-05 11:21:13.327: E/AndroidRuntime(827):  at android.app.ActivityThread.main(ActivityThread.java:5041)
08-05 11:21:13.327: E/AndroidRuntime(827):  at java.lang.reflect.Method.invokeNative(Native Method)
08-05 11:21:13.327: E/AndroidRuntime(827):  at java.lang.reflect.Method.invoke(Method.java:511)
08-05 11:21:13.327: E/AndroidRuntime(827):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
08-05 11:21:13.327: E/AndroidRuntime(827):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
08-05 11:21:13.327: E/AndroidRuntime(827):  at dalvik.system.NativeStart.main(Native Method)
4

4 に答える 4

1

cursor.getString()入れる前にcursor.moveToFirst()

実際にあなたは置くべきです

if(cursor.moveToFirst())
 place = cursor.getString(**columnIndex**);
return place;

あなたの例のカーソルは空なので、サイズ0を返し、位置は-1です。そのため、moveToFirst呼び出しで空かどうかを確認する必要があります。

于 2013-08-05T11:58:26.057 に答える
1
public String getContact(String datevalue,String Userselectvalue) 
{
    String selection = classdbOpenHelper.KEY_DESC + " = 'Userselectvalue'"  
            +" AND " + classdbOpenHelper.KEY_DATE + " = 'datevalue'";
    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor = db.query(classdbOpenHelper.DATABASE_TABLE, 
            new String[] {classdbOpenHelper.KEY_EVENT }, selection, 
            null, null, null, null);
    String  place = null;

    if(cursor.moveToFirst())
    {
        place = cursor.getString(0);
    }

    return place;
}

上記は機能するはずです。

0cursor.getString(0)、返されたレコードの列番号を示します (0 は最初の列です)。

カーソルはばかげていると考えてください。読み取りを開始する位置を指定する必要があります [上の例では、最初のレコード ( .moveToFirst()) と、次のレコードにスキップするタイミング ( cursor.moveToNext())

ただし、クエリを必ず確認する必要があります。LogCat は、カーソルが 0 レコードを返したことを示しています。...with a size of 0

于 2013-08-05T11:54:10.850 に答える