限制房间数据库中的行数

时间:2017-09-13 09:08:55

标签: java android android-room

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

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

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

5 个答案:

答案 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)

您可以通过这样做来限制颜色/行数,

此查询将返回新数据并在达到限制时删除旧数据

解释:

  1. 第一个查询是按降序选择所有数据顺序
  2. 第二个查询是从 coloum/rows id > 20 中删除数据

如果你希望你的表格只有 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()