Androidルームデータベース行の最も古いアイテムを削除して最新のアイテムを挿入する=で行の数を制限するにはどうすればよいですか?
データベースにアイテムを追加するときに、その標準クエリを推測していますか?
編集:データベーステーブルを最大行数20に制限します。その制限に達した場合は、最も古いアイテムを削除し、現在の行数を20に維持して新しいアイテムを挿入します。
データをテーブルに挿入して、最後の20(制限)を除くすべての行を削除できると思います
削除するには、次のクエリを使用できます
DELETE FROM tableName where id NOT IN(SELECT id from tableName ORDER BY id DESC LIMIT 20)
この場合、idは自動インクリメントに設定されている主キーです。日付で保存する場合は、日付もキーとして使用できます
これがサンプルソリューションです。
クエリは:
_@Query("SELECT * FROM user LIMIT :limit OFFSET :offset")
User[] loadAllUsersByPage(int limit,int offset);
_
ここでは、制限とオフセットに基づいてユーザーのリストが表示されます。
loadAllUsersByPage(2,0)
の場合、テーブルから最初の2行を返します。
loadAllUsersByPage(2,1)
の場合、テーブルから2行目と3行目を返します。
しかしloadAllUsersByPage(-1,10)
の場合、テーブルの最初の10行を提供します。
仮定:
あなたのテーブルは
create table example_table (
ts timestamp,
uid number(19),
some_other_field varchar(64)
);
また、クエリを手動で実行する必要はありません。
データベーストリガーを使用する:
create trigger
if not exists -- I don't actually know if you DB will support this line.
-- Might want to remove it if it's not.
example_table_limiter
on example_table
after insert
begin
delete
from example_table
where ts in (
select ts
from example_table
order by ts
limit -1 -- we don't want to limit how many rows we want to delete
offset 25 -- but we want to offset query result so it leaves 25 rows in table
);
end;
「制限なしのオフセット」構文は この答え に触発されています。
Javaでトリガーを有効にするには:
SQLiteOpenHelper
をオーバーライドできるシンプルなAndroid:
public class DataBaseSchemaHelper extends SQLiteOpenHelper {
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(<trigger string from above>);
}
}
Android Roomバージョン:
public MyDatabase extends RoomDatabase {
@Override
public void init(DatabaseConfiguration _config) {
super.init(_config);
getOpenHelper().getWritableDatabase().execSQL(<trigger string from above>);
}
}
次の手順に従ってください。
1>そのテーブルの行数を取得する
your_count = SELECT count( * ) FROM table_name;
2>カウントが>(より大きい)20よりも大きい場合、最も古いレコードを取得します
SELECT *
FROM table_name
ORDER BY entry_Date ASC
LIMIT 1;
3>これらの選択したレコードを削除します
4>新しいデータを挿入する
注:複数のエントリを挿入する場合は、これをループに入れる