2

我想创建一个 FIFO 表,以便通过在新信息到达时删除最旧的元素来仅保存最近的 50 个信息。我可以通过在表中操作 ID 来做到这一点,但我认为这不是最好的解决方案。有没有做好它的想法?

4

5 回答 5

2

您可以假设表中的第一行是最后插入的,而不是检查日期时间、对项目进行排序等等。

在您的 Content Provider 中insert(Uri uri, ContentValues cv),在db.insert拨打电话之前,您可以先使用 getCount() 查询该表上的项目数,如果 count>50 则删除第一行。然后继续您的插入调用。

于 2012-08-02T10:01:33.277 回答
1

您不需要使用 ID 来创建 FIFO 逻辑。最好的办法是DATETIME在您的表中添加另一列,它会自动插入当前时间戳,这将帮助您按此列的升序选择记录。你的新专栏应该是这样的:

DateAdded DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP

确保每次插入新记录时,都必须COUNT检查此表中的总记录,并在必要时删除与DateAdded相关的最旧记录。此外,在删除最旧的记录时,您可以使用LIMIT和/或在您的选择查询中。MAX

于 2012-08-02T09:52:33.177 回答
0

如果表中尚不包含 datetime 类型列,则将其添加到表中,并在每次插入时将其设置为“现在”。然后在每次插入时选择所有限制设置为 50 按日期排序。选择最后一项并运行删除查询以删除比最后一项更早的所有内容。

于 2012-08-02T09:51:54.797 回答
0

必须使用sqlite吗?你可以使用文件处理吗?您可以使用简单的Queue对象并将其保存到文件中。

于 2012-08-02T09:54:35.047 回答
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;
    }
于 2014-07-18T14:22:01.163 回答