簡體   English   中英

限制房間數據庫中的行數

[英]Limit the number of rows in a room database

如何通過刪除行中最舊的項目並插入最新的項目來限制 Android 房間數據庫中的行數?

我猜它是向數據庫添加項目時的標准查詢?

編輯:我想將數據庫表的最大行數限制為 20。如果達到該限制,我們將刪除最舊的項目並通過將當前行數保持為 20 來插入新項目。

這是示例解決方案:

查詢是:

@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 行提供服務。

我認為您可以將數據插入表中,然后刪除除最后 20 行(限制)之外的所有行

要刪除,您可以使用以下查詢

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

在這種情況下,id 是設置為自動遞增的主鍵。 如果按日期存儲它們,也可以使用日期作為鍵

假設:

你的桌子是

    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 中啟用觸發器:

簡單的 Android,您可以在其中覆蓋SQLiteOpenHelper

    public class DataBaseSchemaHelper extends SQLiteOpenHelper {
      @Override
      public void onCreate(SQLiteDatabase db) {     
        db.execSQL(<trigger string from above>);
      }
    }

安卓房間版本:

     public class 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> 插入新數據

注意:如果您要插入多個條目而不是將其放入循環中

您可以通過執行此操作來限制列/行:此查詢將返回新數據並在達到其限制時刪除舊數據。

說明:

  1. 第一個查詢是按降序選擇所有數據順序
  2. 第二個查詢是從 id > 20 的列/行中刪除數據

如果您希望您的表只有 20 行,則將OFFSET設置為 20, LIMIT表示一次插入和刪除的行數。

在我的示例中,當用戶輸入 1 個新數據時,我刪除了 1 行(最舊的/最后一行)


  @Query("SELECT * FROM my_table ORDER BY timeStamp DESC")
  fun getAllData(): List<MyEntityClass>

  @Query("DELETE FROM my_table WHERE id IN (SELECT id FROM my_table ORDER BY timeStamp DESC LIMIT 1 OFFSET 20)")
  fun removeOldData()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM