2012-06-19 36 views
1

你好Stackoverflowers!先進先出(FIFO)命令從sqlite數據庫拉動Android

我創建了一個簡單的sqlite數據庫就像這樣。

//event table name 
private static final String TABLE_EVENTS = "events"; 

//event table columns names 
private static final String KEY_ID = "id"; 
private static final String KEY_EVENT = "event"; 

@Override 
public void onCreate(SQLiteDatabase db) 
{ 
//String to define our database 
String CREATE_EVENT_TABLE = "CREATE TABLE " + TABLE_EVENTS + "(" 
+ KEY_ID + " INTEGER PRIMARY KEY," + KEY_EVENT + " TEXT" + ")"; 

//create our database 
db.execSQL(CREATE_EVENT_TABLE); 
} 

我的理解是一個ID列和事件列的表。

在事件列我存儲一個JSONObject轉換爲一個字符串,我想從FIFO(先進先出)順序表中檢索,以便如果我的應用程序崩潰,我可以發送我有JSONObjects在下次打開應用時存儲。

我可以使用插入到表沒有問題:

public void addEvent(JSONObject event) 
{ 
    //get our database so we can add to it 
    SQLiteDatabase db = this.getWritableDatabase(); 

    //define content values to store our values 
    ContentValues values = new ContentValues(); 

    //add our event to the ContentValues 
    values.put(KEY_EVENT, event.toString()); 

    //insert a row 
    db.insert(TABLE_EVENTS, null, values); 

    //close the database connection 
    db.close(); 
} 

我無法查詢特定的行或事件,並得到來自數據庫的事件,以及一個好的方法來跟蹤事件被插入的順序,以便我可以按FIFO順序將它們取出。

示例代碼特別有用,因爲當我嘗試查詢時,出現語法錯誤,並且不太熟悉SQLite。

任何幫助非常感謝!感謝您的時間。

回答

7

你好VINC最好的辦法是自動遞增的ID,這是你的主鍵,這樣你就可以做到這一點,

String CREATE_EVENT_TABLE = "CREATE TABLE " + TABLE_EVENTS + "(" 
+ KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + KEY_EVENT + " TEXT" + ")"; 

現在你可以在升序與排序依據ID查詢數據庫

database.query("TABLE_EVENTS", new String[]{"KEY_EVENT"},null,null, null, null,"KEY_ID ASC"); 
+1

同樣,將您的密鑰命名爲_id將有助於部分Android自動佈局。 – Pyrodante

+0

這正是我需要的!唯一的問題是,當我將其設置爲光標像這樣: \t \t光標光標= db.query(TABLE_EVENTS,新的String [] {KEY_EVENT},NULL,NULL,NULL,NULL,KEY_ID + 「ASC」); 返回查詢返回:[email protected]當我打電話cursor.toString(),而不是字符串...有什麼建議? – VinC

+0

得到你需要做的事件cursor.getString(0)'0'意味着你在查詢時設置的位置字符串數組中的元素,所以在你的情況下它會是'0',因爲你只有在陣列 – tyczj

2

通常,插入的第一行位於表格的頂部,因此如果要在查詢中使用FIFO查詢整個表格,可以將排序順序設置爲由行ID升序排列,即最新的行將在底部和頂部

getContentLoader().query(DATABASENAME,new String[] {ID,EVENT},null,null,ID+" COLLATE LOCALIZED ASC"); 

這種方式最古老的,當你通過遊標步驟,你將有你想要的順序列表,你可以做任何你想做的事情

編輯

的問候錯誤你得到你需要做的這個

if(cursor != null && cursor.moveToFirst()){ 
    do{ 
     String event = cursor.getString(0); 
     //loops through all the elements in the cursor 
    }while(cursor.moveTONext()); 
} 
cursor.close(); 

這樣可以防止強制關閉,因爲它會檢查是否光標爲空(什麼也沒有),光標被移到第一個元素

+0

「插入的第一行位於桌面上方」是否有保證? – kosa

+0

我碰到過的最後一行插入的每個實例始終都在SQL表的底部,但無論排序順序如何,無論它放在何處 – tyczj

+0

謝謝tyczj您非常有幫助,我非常感謝:-) – VinC

2

您還可以擁有另一個名爲「last_updated」的字段,在插入期間插入一個以毫秒爲單位的時間戳。當你查詢遊標時,你可以按這個字段排序。