限制房间数据库中的行数

问题描述 投票:9回答:4

如何通过删除行中最旧的项目并插入最新的项目来限制Android会议室数据库中的行数?

在向数据库添加项目时,我猜它是一个标准查询?

编辑:我想限制数据库表的最大行数为20。如果达到该限制,我们删除最旧的项目并通过将当前行计数保持为20来插入新项目。

java android android-room
4个回答
13
投票

我认为您可以将数据插入表中,然后删除除最后20行之外的所有行(限制)

要删除,您可以使用以下查询

DELETE FROM tableName其中id NOT IN(SELECTName from tableName ORDER BY id DESC LIMIT 20)

在这种情况下,id是设置为自动递增的主键。如果按日期存储,也可以使用日期作为键


12
投票

以下是示例解决方案:

查询是:

@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行。


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>);
   }
 }

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>插入新数据

注意:如果要插入多个条目而不是将其置于循环中

© www.soinside.com 2019 - 2024. All rights reserved.