如何通过删除行中最旧的项目并插入最新项来限制Android会议室数据库中的行数?
我在向数据库添加项目时猜测它是一个标准查询吗?
编辑:我想限制数据库表的最大行数为20。如果达到该限制,我们删除最旧的项目,并通过将当前行数保持为20来插入新项目。
答案 0 :(得分:10)
我认为您可以将数据插入表中,然后删除除最后20(限制)之外的所有行
要删除,您可以使用以下查询
DELETE FROM tableName where id NOT IN(SELECT id from tableName ORDER BY id DESC LIMIT 20)
在这种情况下,id是设置为自动增量的主键。如果按日期存储日期,也可以使用日期作为键
答案 1 :(得分:10)
这是示例解决方案:
查询是:
@Query("SELECT * FROM user LIMIT :limit OFFSET :offset")
User[] loadAllUsersByPage(int limit,int offset);
在这里,它将基于限制和偏移量提供用户列表。
如果loadAllUsersByPage(2,0)
将从表中返回前2行。
如果loadAllUsersByPage(2,1)
将从表中返回第二行和第三行。
但是如果为loadAllUsersByPage(-1,10)
,它将在表格中提供前10行。
答案 2 :(得分:0)
请按照以下步骤操作:
1>获取该表的行数
your_count = SELECT count( * ) FROM table_name;
2 - ;如果count>>(大于)20而不是获得最早的记录
SELECT *
FROM table_name
ORDER BY entry_Date ASC
LIMIT 1;
3>现在删除这些选定的记录
4>插入新数据
注意:如果要插入多个条目而不是将其置于循环中
答案 3 :(得分:0)
假设:
你的桌子是
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>);
}
}
答案 4 :(得分:0)
您可以通过这样做来限制颜色/行数,
此查询将返回新数据并在达到限制时删除旧数据
解释:
如果你希望你的表格只有 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()