我想創建一個FIFO表,以便通過在新信息到達時刪除最舊的元素來僅保存最近的50個信息。我可以通過操縱表中的ID來實現,但我認爲這不是最好的解決方案。任何想法都做得好嗎?使用SQlite for Android應用程序創建一個FIFO表
2
A
回答
1
你不需要玩ID以創建一個FIFO邏輯。最好的辦法是在表中添加另一列作爲DATETIME
,該列自動插入當前時間戳,這將幫助您按照此列的升序來選擇記錄。你的新列應該是這樣的:
DateAdded DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
確保當過你插入新記錄,你必須在這個表做一個COUNT
檢查的總記錄,並在必要時刪除關於最早的記錄,以DateAdded。此外,您可以在選擇查詢中使用LIMIT
和/或MAX
來刪除最早的記錄。
0
如果日期時間類型列中尚未包含日期時間類型列,並將其設置爲每個插入點上的「now」,則向其添加日期時間類型列。然後在每個插入選擇所有限制設置爲50按日期排序。選擇最後一個項目並運行刪除查詢以刪除比最後一個項目更早的一切。
0
是否必須使用sqlite?你可以使用文件處理?您可以使用簡單的Queue對象並將其保存到文件。
1
而不是檢查日期時間,排序您的項目,而不是,你可以假設表中的第一行是最後一個插入。
在您的內容提供商的insert(Uri uri, ContentValues cv)
中,在調用db.insert
之前,您可以先使用getCount()查詢該表上的項目數,並在count> 50時刪除第一行。然後繼續進行插入呼叫。
0
這是我爲交易清單所做的工作,它的工作原理沒問題。當插入一個新條目我檢查,如果該計數值超過50,如果是這樣,我只是刪除最後一個條目:
// Adding new transaction
public void addTransaction(Transaction transaction) {
SQLiteDatabase db = this.getWritableDatabase();
if(getTransactionsCount() > 50){
List<Transaction> allTransactions = getAllTransactions();
Transaction oldestTransaction = allTransactions.get(allTransactions.size()-1);
deleteTransaction(oldestTransaction);
}
ContentValues values = new ContentValues();
values.put(KEY_TRANSACTION_UID, transaction.getUID());
values.put(KEY_TRANSACTION_AMOUNT, transaction.getAmount());
values.put(KEY_TRANSACTION_IS_ADD, transaction.getIsAdd());
// Inserting Row
db.insert(TABLE_TRANSACTIONS, null, values);
db.close(); // Closing database connection
}
而且getAllTransactions()返回按照從大到小的順序列表(基於ID的主鍵) :
// Getting All Transactions
public List<Transaction> getAllTransactions() {
List<Transaction> transactionList = new ArrayList<Transaction>();
// Select All Query
String selectQuery = "SELECT * FROM " + TABLE_TRANSACTIONS + " ORDER BY " + KEY_TRANSACTION_ID + " DESC";
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
Transaction transaction = new Transaction();
transaction.setID(Integer.parseInt(cursor.getString(0)));
transaction.setUID(cursor.getString(1));
transaction.setAmount(cursor.getString(2));
transaction.setIsAdd(cursor.getString(3));
// Adding contact to list
transactionList.add(transaction);
} while (cursor.moveToNext());
}
// return contact list
return transactionList;
}
相關問題
- 1. 在Android應用程序中未使用SQLite創建表
- 2. 使用SQLite創建android應用程序時出錯數據庫
- 3. 使用React Native for Android創建應用程序
- 4. Android應用程序創建表
- 5. 使用'core'創建Android應用程序
- 6. 使用相機api創建一個android應用程序
- 7. 如何使用電報API創建一個Android應用程序?
- 8. 使用durandal創建一個android應用程序
- 9. 如何在Android PhoneGap應用程序中使用Sqlite創建數據庫圖表?
- 10. Sqlite僅在第一次啓動應用程序時創建表
- 11. 創建Android應用程序
- 12. 創建Android應用程序
- 13. 從現有的Android應用程序創建一個新的Android應用程序
- 14. 如何使用Sqlite for Android創建數據庫文件(.sqlite)?
- 15. Android SQLite不使用SQLiteOpenHelper創建表格
- 16. 創建一個模擬網絡服務器上的FIFO的.NET應用程序
- 17. 在android中創建SQlite數據庫時應用程序freeezes
- 18. 未在Phonegap應用程序中創建SQLite數據庫(Android)
- 19. Android SQLite - 一次創建兩個表
- 20. 爲Android應用程序創建SQLite數據庫
- 21. 如何在Android應用程序之外創建SQLite數據庫?
- 22. 錯誤的應用程序域創建一個應用程序
- 23. TestFlight for Android應用程序
- 24. SQLite vs Couchbase Lite for Xamarin應用程序
- 25. 創建一個應用程序,通過點擊創建其他應用程序
- 26. 如何爲android應用程序創建一個通用菜單
- 27. [ruby]創建一個應用程序
- 28. 爲應用程序創建一個URI
- 29. C#創建一個ListBox應用程序
- 30. 創建一個活動應用程序
謝謝你的幫助。我採用了類似的方法來優化代碼。 – Shannon 2012-08-03 07:25:31
請您詳細解釋一下嗎? – 2015-03-18 11:19:47