2

新しい情報が到着したときに最も古い要素を削除して、最新の50の情報のみを保存するために、FIFOテーブルを作成したいと思います。テーブルのIDを操作することでそれを行うことはできますが、それが最善の解決策ではないと思います。それをうまくやるという考えはありますか?

4

5 に答える 5

2

日時を確認したり、アイテムを並べ替えたりする代わりに、テーブルの最初の行が最後に挿入されると想定できます。

コンテンツ プロバイダのinsert(Uri uri, ContentValues cv)では、呼び出しを行う前に、db.insert最初に getCount() を使用してそのテーブルのアイテム数をクエリし、count>50 の場合は最初の行を削除できます。次に、挿入呼び出しを続行します。

于 2012-08-02T10:01:33.277 に答える
1

FIFO ロジックを作成するために ID をいじる必要はありません。DATETIMEこの列に関して昇順でレコードを選択するのに役立つ現在のタイムスタンプを自動的に挿入するテーブルのように、別の列を追加するのが最善です。新しい列は次のようになります。

DateAdded DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP

新しいレコードを挿入するときはいつでもCOUNT、このテーブルの合計レコードを確認し、必要に応じてDateAddedに関して最も古いレコードを削除する必要があります。さらに、最も古いレコードを削除する場合は、select-queryでLIMITand/orを使用できます。MAX

于 2012-08-02T09:52:33.177 に答える
0

sqliteを使用する必要がありますか? ファイルハンドリングは使えますか?単純なQueueオブジェクトを使用してファイルに保存できます。

于 2012-08-02T09:54:35.047 に答える
0

これは私がトランザクションのリストに対して行ったことであり、問​​題なく動作します。新しいエントリを挿入するときに、カウントが 50 を超えているかどうかを確認し、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 に答える
0

テーブルに日時型の列がまだ含まれていない場合は追加し、挿入ごとに「現在」に設定します。次に、各挿入で、日付でソートされた制限を 50 に設定してすべてを選択します。最後のアイテムを選択し、削除クエリを実行して、この最後のアイテムより古いものをすべて削除します。

于 2012-08-02T09:51:54.797 に答える