2015-11-06 138 views
-2

夥計們。java.lang.IllegalStateException:無法讀取來自CursorWindow的第0行,第-1列

我在我的應用程序中有一個數據庫。

數據庫以編程方式創建。

我想從數據庫中獲取數據,它返回的列索引是-1。

數據庫中有數據,但列索引爲-1,我無法返回數據。

如何解決這個問題?

這是我的代碼;

將項目添加到數據庫的代碼。

String task = "cook lunch"; 

helper = new TaskDBHelperHome(MainActivity.this); 
SQLiteDatabase db = helper.getWritableDatabase(); 

ContentValues values = new ContentValues(); 

values.clear(); 
values.put("task", task); 

db.insertWithOnConflict(TaskContractHome.TABLE, null, values, 
     SQLiteDatabase.CONFLICT_IGNORE); 

並顯示數據的代碼。

helper = new TaskDBHelperHome(mcontext); 
    SQLiteDatabase homeDB = helper.getReadableDatabase(); 
    Cursor cursor = homeDB.rawQuery("SELECT COUNT(*) FROM hometasks", null); 

    cursor.moveToFirst(); 
    if (cursor != null && cursor.moveToFirst()) { 
     if (cursor.getInt(0) == 1) { 

      cursor.moveToFirst(); 
      Integer indexnum = cursor.getColumnIndex("task"); 

      String index = Integer.toString(cursor.getColumnIndex("task")); 

      String hometodo = cursor.getString(indexnum); 

      Log.d("DatabaseTodoListManager", "Your to-do is " + hometodo); 

      //expected to return the data "cook lunch", 
      //but shows the error java.lang.IllegalStateException 

      cursor.close(); 
     } 
    } 

TaskDBHelperHome.java

public class TaskDBHelperHome extends SQLiteOpenHelper { 

    public TaskDBHelperHome(Context context) { 
     super(context, TaskContractHome.DB_NAME, null, TaskContractHome.DB_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase sqlDB) { 
     String sqlQuery = 
       String.format("CREATE TABLE %s (" + 
           "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + 
           "%s TEXT)", TaskContractHome.TABLE, 
         TaskContractHome.Columns.TASK); 

     Log.d("TaskDBHelper","Query to form table: "+sqlQuery); 
     sqlDB.execSQL(sqlQuery); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase sqlDB, int i, int i2) { 
     sqlDB.execSQL("DROP TABLE IF EXISTS "+TaskContractHome.TABLE); 
     onCreate(sqlDB); 
    } 
} 

TaskContractHome.java

public class TaskContractHome { 
    public static final String DB_NAME = "home"; 
    public static final int DB_VERSION = 1; 
    public static final String TABLE = "hometasks"; 

    public class Columns { 
     public static final String TASK = "task"; 
     public static final String _ID = BaseColumns._ID; 
    } 
} 

,瞭解更多信息logcat的錯誤:

E/CursorWindow: Failed to read row 0, column -1 from a CursorWindow which has 1 rows, 1 columns. 
D/AndroidRuntime: Shutting down VM 
E/AndroidRuntime: FATAL EXCEPTION: main 
E/AndroidRuntime: Process: com.bedrock.live, PID: 14081 
E/AndroidRuntime: java.lang.RuntimeException: Unable to start receiver com.bedrock.live.service.WiFiService: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 
E/AndroidRuntime:  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2601) 
E/AndroidRuntime:  at android.app.ActivityThread.access$1800(ActivityThread.java:144) 
E/AndroidRuntime:  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1370) 
E/AndroidRuntime:  at android.os.Handler.dispatchMessage(Handler.java:102) 
E/AndroidRuntime:  at android.os.Looper.loop(Looper.java:135) 
E/AndroidRuntime:  at android.app.ActivityThread.main(ActivityThread.java:5238) 
E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Native Method) 
E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Method.java:372) 
E/AndroidRuntime:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:931) 
E/AndroidRuntime:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:726) 
E/AndroidRuntime:  at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:115) 
E/AndroidRuntime: Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 
E/AndroidRuntime:  at android.database.CursorWindow.nativeGetString(Native Method) 
E/AndroidRuntime:  at android.database.CursorWindow.getString(CursorWindow.java:438) 
E/AndroidRuntime:  at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51) 
E/AndroidRuntime:  at com.bedrock.live.service.WiFiService.homeNotification(WiFiService.java:106) 
E/AndroidRuntime:  at com.bedrock.live.service.WiFiService.count(WiFiService.java:82) 
E/AndroidRuntime:  at com.bedrock.live.service.WiFiService.Wifi(WiFiService.java:64) 
E/AndroidRuntime:  at com.bedrock.live.service.WiFiService.onReceive(WiFiService.java:45) 
E/AndroidRuntime:  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2594) 
E/AndroidRuntime:  at android.app.ActivityThread.access$1800(ActivityThread.java:144)  
E/AndroidRuntime:  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1370)  
E/AndroidRuntime:  at android.os.Handler.dispatchMessage(Handler.java:102)  
E/AndroidRuntime:  at android.os.Looper.loop(Looper.java:135)  
E/AndroidRuntime:  at android.app.ActivityThread.main(ActivityThread.java:5238)  
E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Native Method)  
E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Method.java:372)  
E/AndroidRuntime:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:931)  
E/AndroidRuntime:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:726)  
E/AndroidRuntime:  at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:115)  
+4

'SELECT COUNT(*)FROM hometasks' <=多少列返回該查詢?它有「任務」列嗎?不要問這個問題,並開始思考 – Selvin

+0

對不起,我不明白關於sql的一件事... –

回答

1

您定義光標這樣的:

cursor = homeDB.rawQuery("SELECT COUNT(*) FROM hometasks", null); 

集合函數COUNT(*)的結果沒有列名。所以,

indexnum = cursor.getColumnIndex("task"); 

將'-1'分配給'indexnum'。

查詢只會給你一個整數值(行數),如果你想要「任務」列的值,你需要一個不同的查詢。

擾流:

Cursor cursor = homeDB.rawQuery("SELECT tasks FROM hometasks", null);

+0

什麼是完美的答案 –

相關問題