我想创建一个FIFO表,以便在新信息到达时通过删除最旧的元素来仅保存最近50个最近的信息。我可以通过操作表中的ID来实现,但我不认为这是最好的解决方案。做得好吗?
答案 0 :(得分:1)
您无需使用ID来创建FIFO逻辑。最好的方法是在表中添加另一列DATETIME
,它会自动插入当前时间戳,以帮助您按照此列的升序选择记录。您的新专栏应该是:
DateAdded DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
确保在插入新记录时,必须对此表中的总记录进行COUNT
检查,并在必要时删除与添加日期相关的最旧记录。此外,在删除最旧的记录时,您可以在select-query中使用LIMIT
和/或MAX
。
答案 1 :(得分:1)
您可以假设表中的第一行是最后一行插入,而不是检查日期时间,排序项目等等。
在您的内容提供商insert(Uri uri, ContentValues cv)
中,在进行db.insert
调用之前,您可以先使用getCount()查询该表中的项目数,如果count> 50,则删除第一行。然后继续进行插入调用。
答案 2 :(得分:0)
如果尚未包含日期时间类型列,则将其添加到表中,并在每个插入上将其设置为“now”。然后在每个插入上选择所有限制设置为50按日期排序。选择最后一项并运行删除查询以删除比最后一项更早的所有内容。
答案 3 :(得分:0)
是否必须使用sqlite?你能用文件处理吗?您可以使用简单的Queue对象并将其保存到文件中。
答案 4 :(得分: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;
}