web-dev-qa-db-ja.com

ルームデータベースの行数を制限する

Androidルームデータベース行の最も古いアイテムを削除して最新のアイテムを挿入する=で行の数を制限するにはどうすればよいですか?

データベースにアイテムを追加するときに、その標準クエリを推測していますか?

編集:データベーステーブルを最大行数20に制限します。その制限に達した場合は、最も古いアイテムを削除し、現在の行数を20に維持して新しいアイテムを挿入します。

15
x10sion

データをテーブルに挿入して、最後の20(制限)を除くすべての行を削除できると思います

削除するには、次のクエリを使用できます

DELETE FROM tableName where id NOT IN(SELECT id from tableName ORDER BY id DESC LIMIT 20)

この場合、idは自動インクリメントに設定されている主キーです。日付で保存する場合は、日付もキーとして使用できます

16
Kunu

これがサンプルソリューションです。

クエリは:

_@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行を提供します。

15

仮定:

あなたのテーブルは

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
M. Prokhorov

次の手順に従ってください。

1>そのテーブルの行数を取得する

your_count = SELECT count( * ) FROM table_name;

2>カウントが>(より大きい)20よりも大きい場合、最も古いレコードを取得します

SELECT *
  FROM table_name
 ORDER BY entry_Date ASC
 LIMIT 1;

3>これらの選択したレコードを削除します

4>新しいデータを挿入する

注:複数のエントリを挿入する場合は、これをループに入れる

0
Amit Vaghela