【问题标题】:Store history in database在数据库中存储历史记录
【发布时间】:2012-02-10 10:56:19
【问题描述】:

我想将历史数据存储在 sqlite 数据库中。 最多应保护 20 个“条目”。

添加新条目时,应删除最旧的条目,并在列表开头添加新条目。 调用 histroy 时,我希望它以相反的顺序显示(最新条目优先)

据我所知,光标本身无法实现该功能。我需要将我调用的光标转换为另一种 MAP 类型。问题是哪一个以及如何实现这些操作。

【问题讨论】:

  • 为什么不在将元素添加到数据库的函数中处理所有这些?
  • 当然。问题是该功能的外观。例如,我不知道如何以“简单”的方式实现对最旧值的替换。当然,我可以将日期+时间作为字符串存储在数据库中,并在每个添加/请求事件中将其转换回,然后使用某种排序按日期排序。但是每一个动作都会发生这种情况,这有点开销!

标签: java android sqlite map cursor


【解决方案1】:

这不应该那么难。您的历史表需要一个 id 列。在使用游标和适配器时,它也是强制性的。将 id 列定义为auto incremented。因此,每次您在表中插入新行时,新行都会自动获得一个唯一 ID,该 ID 高于分配给之前插入的行的最后一个 ID。

您必须编写一个方法,当您想向数据库添加新条目时调用该方法。在方法中,您执行以下操作。

  1. 检查数据库表中的项目数。
    • 如果条目少于 20 个,则不执行任何操作。
    • 如果条目多于或等于 20 个,则查询带有 lowest id 的行并将其删除。
  2. 将新条目添加到数据库中。它将自动获取表中所有行的最高 id。

当您想使用游标在列表中显示条目时,您可以通过 SQL 命令order by 定义返回行的顺序。

【讨论】:

  • 这就是我要找的东西!我是所有 sql 命令中的一员,但由于我很少使用 sql,所以我没有想到它!谢谢!
  • id 会自动分配吗?由于将删除具有最低 id 的行,因此会有一个间隙。还是delete方法也处理了这个问题?
  • 数据库通常有不同的自动增量模式。通常,每一行都有一个 id,该 id 高于曾经分配给表中任何行的任何其他 id。因此,当表中有 4 行时,删除 id 为 2 的行并插入新行,新行将获得 5 或更高的 id。还有其他模式可以重用已删除行的 id,或者 id 不仅对于单个表而且对于整个数据库都是唯一的。但我认为SQLite 只提供了我提到的第一种模式。
  • 嗯,我可以使用类似String sql = "SELECT COUNT (DISTINCT " + HISTORY_ID + ") FROM " + HISTORY_TABLE; Cursor cursor = db.rawQuery(sql, null); 的计数,但是我如何从光标中获取计数?这种请求的列名是什么?
  • 当您使用此 SQL 命令查询数据库时,您将获得一个包含一个结果行的游标。结果行将是 int 类型。光标 cursor = db.rawQuery("SELECT COUNT (DISTINCT" + HISTORY_ID + ") FROM " + HISTORY_TABLE, null);整数计数 = 0; while(cursor.moveToFirst()){ count = cursor.getInt(0); } count 变量将包含表中的行数。
猜你喜欢
  • 1970-01-01
  • 2022-10-24
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 2015-10-19
  • 2015-06-04
相关资源
最近更新 更多