2016-04-28 54 views
0

我想添加一個TIMESTAMP列到我的SQLite數據庫。該列將用於使用「System.currentTimeMillis();」來捕獲時間戳記數據。應用程序崩潰,錯誤來自下面的** **行所示的光標代碼。錯誤信息爲「無法啓動活動ComponentInfo {... ListActivity}:java.lang.IllegalStateException:無法從CursorWindow讀取第0行,第6列。確保遊標在從中訪問數據前正確初始化。Android:我如何解決時間戳添加到我的SQLite數據庫?

最初,我在模型文件中將變量設置爲字符串。然後我嘗試了很長時間,但都沒有成功。我在這裏錯過了什麼?

的UserData文件:

... 
public long getTimestamp() { 
    return timestamp; 
} 

public void setTimestamp(long timestamp) { 
    this.timestamp = timestamp; 

DatabaseHelper.java文件:

... 
private static final String SQL_CREATE_ENTRIES = 
     "CREATE TABLE IF NOT EXISTS " + DBContract.DBEntry.TABLE_NAME + 
      "(" + DBContract.DBEntry.COLUMN_NAME_ID + 
        " INTEGER PRIMARY KEY AUTOINCREMENT," 
       + DBContract.DBEntry.COLUMN_NAME_TODO + 
        " TEXT," 
       + DBContract.DBEntry.COLUMN_NAME_NOTE1 + 
        " TEXT," 
       + DBContract.DBEntry.COLUMN_NAME_NOTE2 + 
        " TEXT," 
       + DBContract.DBEntry.COLUMN_NAME_DUEDATE + 
        " TEXT," 
       + DBContract.DBEntry.COLUMN_NAME_DUETIME + 
       " TEXT," 
       + DBContract.DBEntry.COLUMN_NAME_TIMESTAMP + 
        " TEXT" + ")"; 
... 

public void insertIntoDB(String todo, String note1, String note2, String duedate, String duetime, long timestamp) { 

    SQLiteDatabase db = this.getWritableDatabase(); 

    ContentValues values = new ContentValues(); 
    values.put(DBContract.DBEntry.COLUMN_NAME_TODO, todo); 
    values.put(DBContract.DBEntry.COLUMN_NAME_NOTE1, note1); 
    values.put(DBContract.DBEntry.COLUMN_NAME_NOTE2, note2); 
    values.put(DBContract.DBEntry.COLUMN_NAME_DUEDATE, duedate); 
    values.put(DBContract.DBEntry.COLUMN_NAME_DUETIME, duetime);   
    values.put(DBContract.DBEntry.COLUMN_NAME_TIMESTAMP, timestamp); 

    db.insert(DBContract.DBEntry.TABLE_NAME, null, values); 
    db.close(); 
} 
... 

Cursor cursor = db.rawQuery(query,null); 

     try { 
      if (cursor.moveToFirst()) { 
       do { 
        UserData userData = new UserData(); 
        userData.setTodo(cursor.getString(1)); 
        userData.setNote1(cursor.getString(2)); 
        userData.setNote2(cursor.getString(3)); 
        userData.setDuedate(cursor.getString(4)); 
        userData.setDuetime(cursor.getString(5)); 
        **userData.setTimestamp(cursor.getLong(6));** 

        modelList.add(0, userData); 
        } while (cursor.moveToNext()); 
... 

ListAdapter.java文件:

... 
public void onBindViewHolder(final ListViewHolder holder, final int position) { 
    ... 
    holder.cardBlankText5.setText((int) dbList.get(position).getTimestamp()); 

Activity.java文件:

... 
public void onClickSave(View v) { 
    ... 
    long timestamp=System.currentTimeMillis(); 
    helper = new DatabaseHelper(Activity.this); 
    helper.insertIntoDB(todo,note1,note2,duedate,duetime,timestamp); 
    startActivity(new Intent(Activity.this,ListActivity.class)); 
} 
+0

,你看到了什麼? – pskink

+0

顯示查詢。 –

+0

@CL你的意思是調用dumpCursor並顯示Logcat結果? – AJW

回答

-1

DBContract.DBEntry.COLUMN_NAME_TIMESTAMP作爲DATETIME類型應該有效。我通常有實用方法,它採用光標,列名和返回日期對象:

public static Date getDateColumn(Cursor c, String column) { 
    Date d = null; 
    Long time = c.getLong(c.getColumnIndexOrThrow(column)); 
    if (time != null && time != 0) { 
     d = new Date(); 
     d.setTime(time); 
    } 
    return d; 
} 

檢查的第二件事是,是否該字段被要求在您的查詢。分享query的價值可能會帶來一些亮點,但通常當您要求的列不在投影中時,您會得到類似的情況。

例如從mytable中選擇columnA,columnB;然後嘗試從列C中獲取某些不在結果中的內容。

+0

正確,所以我試圖對數據庫執行查詢並在光標中設置時間戳數據,以便我可以在RecyclerView列表中使用光標。不知道如何使用您的實用程序方法與我的userData對象的遊標,如上所示。 – AJW

+0

只有第3行與您相關,因爲您希望將其作爲長時間存儲在POJO中,如果要將其作爲Date對象存儲,則該方法非常有用。無論如何,在表中存儲爲'DATETIME'應該可以解決您的問題。確保在刪除應用程序並在更改表格定義後重新安裝它。 – rossco

+0

所以你建議用「DATETIME」替換TIMESTAMP的「TEXT」? – AJW

-1

不要試圖從聲明爲TEXT的列中獲取Long。將其聲明爲INTEGER。 或使用getString()並將值轉換爲Long。在`rawQuery`調用`DatabaseUtils#dumpCursor`之後的

+0

啊,是的。我會嘗試用INT替換。 – AJW

+0

沒有運氣,拋出同樣的錯誤。 – AJW

+0

您確定數據庫是在設備/模擬器上重新創建的嗎?或者你使用db與舊值? –

相關問題