簡體   English   中英

Android SQLite異常

[英]Android SQLite Exception

我正在使用SQLite數據庫存儲一些數據。 檢索時出現異常。 我不知道我在做什么錯。 這就是為什么我問這個問題。

數據庫代碼:

//Creating the database
@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE "+garbageTable+" (" +colID+ " INTEGER PRIMARY KEY AUTOINCREMENT , " +colName+ " TEXT, "+colInterval+ " INTEGER, " +colDate+ " INTEGER, " +colImage+ " INTEGER)");
}

//Insert some data
public void insertGarbageObject(GarbageObject g){
    SQLiteDatabase db=this.getWritableDatabase();
    ContentValues cv=new ContentValues();

    cv.put(colName, g.name);
    cv.put(colInterval, g.dayInterval);
    cv.put(colDate, g.date.getTimeInMillis());
    cv.put(colImage, g.image);
    db.insert(garbageTable, colID, cv);

    db.close(); 
}

//Read all inserted data
public ArrayList<GarbageObject> getGarbageObjects(){
    ArrayList<GarbageObject> garbageObjects = new ArrayList<GarbageObject>();

    SQLiteDatabase db=this.getReadableDatabase();
    Cursor cur=db.rawQuery("SELECT * FROM "+garbageTable,new String [] {});
    for(int i = 0; i<cur.getCount(); i++){
        GarbageObject g = new GarbageObject(c.getString(R.string.naam));
        g.ID = cur.getInt(cur.getColumnIndexOrThrow(colID));//Exception occurs!
        g.name = cur.getString(cur.getColumnIndexOrThrow(colName));//Exception occurs!
        g.dayInterval = cur.getInt(cur.getColumnIndexOrThrow(colInterval));//Exception occurs!
        g.date.setTimeInMillis(cur.getLong(cur.getColumnIndexOrThrow(colDate)));//Exception occurs!
        g.image = cur.getInt(cur.getColumnIndexOrThrow(colImage));//Exception occurs!


        garbageObjects.add(g);
    }
    cur.close();
    db.close();

    return garbageObjects;
}

我的日志:

10-14 17:35:58.356: W/dalvikvm(18570): threadid=1: thread exiting with uncaught exception (group=0x40f27680)
10-14 17:35:58.356: E/AndroidRuntime(18570): FATAL EXCEPTION: main
10-14 17:35:58.356: E/AndroidRuntime(18570): java.lang.RuntimeException: Unable to start activity ComponentInfo{robin.garbagereminder/robin.activities.MainActivity}: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1
10-14 17:35:58.356: E/AndroidRuntime(18570):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java)
10-14 17:35:58.356: E/AndroidRuntime(18570):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java)
10-14 17:35:58.356: E/AndroidRuntime(18570):    at android.app.ActivityThread.access$600(ActivityThread.java)
10-14 17:35:58.356: E/AndroidRuntime(18570):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java)
10-14 17:35:58.356: E/AndroidRuntime(18570):    at android.os.Handler.dispatchMessage(Handler.java)
10-14 17:35:58.356: E/AndroidRuntime(18570):    at android.os.Looper.loop(Looper.java)
10-14 17:35:58.356: E/AndroidRuntime(18570):    at android.app.ActivityThread.main(ActivityThread.java)
10-14 17:35:58.356: E/AndroidRuntime(18570):    at java.lang.reflect.Method.invokeNative(Native Method)
10-14 17:35:58.356: E/AndroidRuntime(18570):    at java.lang.reflect.Method.invoke(Method.java)
10-14 17:35:58.356: E/AndroidRuntime(18570):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
10-14 17:35:58.356: E/AndroidRuntime(18570):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)
10-14 17:35:58.356: E/AndroidRuntime(18570):    at dalvik.system.NativeStart.main(Native Method)
10-14 17:35:58.356: E/AndroidRuntime(18570): Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1
10-14 17:35:58.356: E/AndroidRuntime(18570):    at android.database.AbstractCursor.checkPosition(AbstractCursor.java)
10-14 17:35:58.356: E/AndroidRuntime(18570):    at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java)
10-14 17:35:58.356: E/AndroidRuntime(18570):    at android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java)
10-14 17:35:58.356: E/AndroidRuntime(18570):    at robin.garbagereminder.DatabaseHelper.getGarbageObjects(DatabaseHelper.java:59)
10-14 17:35:58.356: E/AndroidRuntime(18570):    at robin.activities.MainActivity.init(MainActivity.java:88)
10-14 17:35:58.356: E/AndroidRuntime(18570):    at robin.activities.MainActivity.onCreate(MainActivity.java:33)
10-14 17:35:58.356: E/AndroidRuntime(18570):    at android.app.Activity.performCreate(Activity.java)
10-14 17:35:58.356: E/AndroidRuntime(18570):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java)
10-14 17:35:58.356: E/AndroidRuntime(18570):    ... 12 more

您沒有正確使用SQliteCursor,它的工作方式如下:

if (cur != null ) {
    if  (cur.moveToFirst()) {
        do {
            String tmp = c.getString(R.string.naam)
            ...
        }while (cur.moveToNext());
    }
}

在您的示例中,您對游標對象不執行任何操作,對游標也不執行任何操作。 在for-Loop的開頭添加cur.moveToNext()完全相同,但是更干凈的版本是while循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM