如何限制 Android Room 数据库的行数,通过删除最旧的一行并插入最新的行来实现?
我猜想这是在向数据库添加项目时使用的标准查询吗?
编辑:我希望将数据表限制为最多包含 20 行。如果达到该限制,则需要删除最旧的项目并插入最新的项目,从而保持当前行数为 20。
如何限制 Android Room 数据库的行数,通过删除最旧的一行并插入最新的行来实现?
我猜想这是在向数据库添加项目时使用的标准查询吗?
编辑:我希望将数据表限制为最多包含 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行。
Integer.MAX_VALUE
作为限制条件传递,那么与没有LIMIT
子句的查询相比,性能会更差吗? - MarkMAX_VALUE
(包括超过Long.MAX_VALUE
)的值,因此它们通常不会在限制和偏移量中赋予Integer.MAX_VALUE
任何特殊含义。 - M. Prokhorov我认为您可以将数据插入到表中,然后删除除了最后20条以外的所有行(使用limit)
若要删除,您可以使用以下查询语句:
DELETE FROM tableName where id NOT IN (SELECT id from tableName ORDER BY id DESC LIMIT 20)
在这种情况下,id是主键,其被设置为自动递增。如果您按日期存储数据,也可以使用日期作为键。
@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()
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
的Simple Android:
public class DataBaseSchemaHelper extends SQLiteOpenHelper {
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(<trigger string from above>);
}
}
Android Room 版本:
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> 插入新数据
注意:如果您要插入多个条目,请将其放入循环中