我想创建一个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. Android应用程序创建表
- 4. 使用相机api创建一个android应用程序
- 5. 如何使用电报API创建一个Android应用程序?
- 6. 创建Android应用程序
- 7. 创建Android应用程序
- 8. Android SQLite不使用SQLiteOpenHelper创建表格
- 9. 创建一个模拟网络服务器上的FIFO的.NET应用程序
- 10. Android SQLite - 一次创建两个表
- 11. 未在Phonegap应用程序中创建SQLite数据库(Android)
- 12. 如何在Android应用程序之外创建SQLite数据库?
- 13. 为Android应用程序创建SQLite数据库
- 14. TestFlight for Android应用程序
- 15. 错误的应用程序域创建一个应用程序
- 16. 如何为android应用程序创建一个通用菜单
- 17. SQLite vs Couchbase Lite for Xamarin应用程序
- 18. 如何使用sqlite创建asp.net web应用程序
- 19. C#创建一个ListBox应用程序
- 20. 为应用程序创建一个URI
- 21. 创建一个活动应用程序
- 22. 创建一个Drools Web应用程序
- 23. [ruby]创建一个应用程序
- 24. 为应用程序创建一个GUI
- 25. 创建Android应用程序构建
- 26. 在android中使用SQLite帮助程序创建数据库
- 27. 通过使用Microsoft.Web.Administration库创建IIS应用程序创建两个应用程序而不是一个
- 28. 构建多种风格的Android应用程序创建多个应用程序
- 29. 如何使用一个项目创建多个应用程序
- 30. 创建一个Android GPS跟踪应用程序
谢谢你的帮助。我采用了类似的方法来优化代码。 – Shannon 2012-08-03 07:25:31
请您详细解释一下吗? – 2015-03-18 11:19:47