[英]Android Studio- Java RecyclerView displaying more views(holders) than the number of rows in a Room Database
[英]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> 插入新數據
注意:如果您要插入多個條目而不是將其放入循環中
您可以通過執行此操作來限制列/行:此查詢將返回新數據並在達到其限制時刪除舊數據。
說明:
如果您希望您的表只有 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.