如何通过删除行中最旧的项目并插入最新的项目来限制Android会议室数据库中的行数?
在向数据库添加项目时,我猜它是一个标准查询?
编辑:我想限制数据库表的最大行数为20。如果达到该限制,我们删除最旧的项目并通过将当前行计数保持为20来插入新项目。
我认为您可以将数据插入表中,然后删除除最后20行之外的所有行(限制)
要删除,您可以使用以下查询
DELETE FROM tableName其中id NOT IN(SELECTName 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)
它将从表返回前两行。
如果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;
“无限制偏移”语法的灵感来自this answer。
要在java中启用触发器:
简单的Android,你可以覆盖SQLiteOpenHelper
:
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>如果count>(大于)20而不是获得最早的记录
SELECT *
FROM table_name
ORDER BY entry_Date ASC
LIMIT 1;
3>现在删除这些选定的记录
4>插入新数据
注意:如果要插入多个条目而不是将其置于循环中