2017-03-16 94 views
1

在這些情況下,有沒有人遇到過這個錯誤?Android SQLite奇怪的錯誤

無法從CursorWindow讀取第1行第8列。

我知道這意味着它試圖讀取列8的數據,但事情是我只有7列,我從來沒有試圖從第8列顯然分配數據。

我的問題是,每當我清除數據並再次開始,它工作正常,然後突然啓動引發錯誤。

這是我的表:

public String CREATE_TABLE = "CREATE TABLE BreakTests (" + 
     "Id INTEGER PRIMARY KEY AUTOINCREMENT, " + 
     "Answered_Question_Set_ID INTEGER, " + 
     "PassValue INTEGER, " + 
     "Value1 INTEGER, " + 
     "Value2 INTEGER, " + 
     "Value3 INTEGER, " + 
     "Value4 INTEGER, " + 
     "Value5 INTEGER)"; 

這些都是我的專欄:

public final String KEY_ID = "Id"; 
public final String KEY_ANSWERED_QUESTION_SET_ID = "Answered_Question_Set_ID"; 
public final String KEY_PASS_VALUE = "PassValue"; 
public final String KEY_VALUE_1 = "Value1"; 
public final String KEY_VALUE_2 = "Value2"; 
public final String KEY_VALUE_3 = "Value3"; 
public final String KEY_VALUE_4 = "Value4"; 
public final String KEY_VALUE_5 = "Value5"; 

public final String[] COLUMNS = {KEY_ID, KEY_ANSWERED_QUESTION_SET_ID, KEY_PASS_VALUE, KEY_VALUE_1, KEY_VALUE_2, KEY_VALUE_3, KEY_VALUE_4, KEY_VALUE_5}; 

這是我的查詢:

public ArrayList<BreakTest> GetForSync() { 
    ArrayList<BreakTest> tests = new ArrayList<BreakTest>(); 

    String selectQuery = "SELECT Id, Answered_Question_Set_ID, PassValue, Value1, Value2, Value3, Value4, Value5 FROM BreakTests"; 
    Cursor cursor = Shared.db.getReadableDatabase().rawQuery(selectQuery, new String[] { }); 
    BreakTest breakTest; 
    if (cursor.moveToFirst()) { 
     do { 
      breakTest = new BreakTest(); 
      breakTest.Id = cursor.getInt(cursor.getInt(cursor.getColumnIndex(KEY_ID))); 
      breakTest.Answered_Question_Set_ID = cursor.getInt(cursor.getColumnIndex(KEY_ANSWERED_QUESTION_SET_ID)); 
      breakTest.PassValue = cursor.getInt(cursor.getColumnIndex(KEY_PASS_VALUE)); 
      breakTest.Value1 = cursor.getInt(cursor.getColumnIndex(KEY_VALUE_1)); 
      breakTest.Value2 = cursor.getInt(cursor.getColumnIndex(KEY_VALUE_2)); 
      breakTest.Value3 = cursor.getInt(cursor.getColumnIndex(KEY_VALUE_3)); 
      breakTest.Value4 = cursor.getInt(cursor.getColumnIndex(KEY_VALUE_4)); 
      breakTest.Value5 = cursor.getInt(cursor.getColumnIndex(KEY_VALUE_5)); 

      tests.add(breakTest); 
     } while (cursor.moveToNext()); 
    } 

    return tests; 
} 

我已經與Android Studio和SQLite的工作了一段時間了,我從來沒有遇到過這個問題。

任何意見/反饋將非常感激!

+1

我們能有堆棧跟蹤的副本? –

+0

您現有的表只能有7列,您可以添加新的coumnrecently,試圖改變表或清除應用數據,然後再次嘗試 – MathaN

+0

喬希:每當我試圖獲取完整的堆棧跟蹤我的應用程序崩潰,我只能給予是例外信息。 MathaN:我之前已經清除了數據,並且它可以正常工作一段時間,然後突然開始發生錯誤。 – James

回答

1

感謝所有意見問題與這行代碼;

breakTest.Id = cursor.getInt(cursor.getInt(cursor.getColumnIndex(KEY_ID))); 

改爲

breakTest.Id = cursor.getInt(cursor.getColumnIndex(KEY_ID)); 
0

你爲什麼要提供new String[] {}當你不需要來傳遞參數?

試試這個

Cursor cursor = Shared.db.getReadableDatabase().rawQuery(selectQuery, null); 
+0

感謝您指出這一點,改變建議,但沒有區別。 – James

+0

請參閱@格里斯克答案,我認爲他是對的。你有8列。 –

-1

據我可以指望,你的表 8列,而不是7 標識,問題,通過和5倍的值。 因此,如果消息「無法從列8中讀取」,則該消息非常有效,例如,只需輸入NULL即可嘗試.getIntUse cursor.isNull(columnIndex)確保,沒有有效的數據裏面,就像你列

if (!cursor.isNull(cursor.getColumnIndex(KEY_VALUE_1))) breakTest.value1=cursor.getInt(...) 

沒有被定義爲NOT NULL,所以你需要在代碼檢查。

+0

如果我在這裏(正如其他人已經提出的那樣),你可以通過接受這個答案來表示感謝。謝謝。 – Grisgram

+0

第8列是第9列。這個錯誤信息不能發生NULL值。 –

+0

無論如何,對於具有可爲空列的表,空檢查不是一個壞主意。 – Grisgram