【问题标题】:Get random record in SQLite在 SQLite 中获取随机记录
【发布时间】:2015-03-30 17:06:10
【问题描述】:

我像这样在我的 SQLite 数据库中获取记录。

spellId = extra.getString("spellId");
DBase db = new DBase(this);
db.open();
String[] data = db.getRecord(Integer.parseInt(spellId));
db.close();

我可以在不使用原始查询和游标的情况下获得这样的随机数据吗?

【问题讨论】:

标签: android sqlite random


【解决方案1】:

试试这样:

db.rawQuery("SELECT * FROM mainTable ORDER BY RANDOM() LIMIT 1", null);

【讨论】:

  • 这可行,但不建议用于大型表。 Order By Random() 不能很好地随行数扩展。
【解决方案2】:

你可以用Random#nextInt()点赞

String[] data = db.getRecord(new Random().nextInt(num));

num 在您的记录 ID 范围内。您需要调整此解决方案,以防您的 Id 分散且不形成连续范围。

其中一种方法是首先创建一个查询以获取所有主键并将值存储在某处的集合中。然后通过使用Random 生成索引来选择随机键。

String[] data = db.getRecord(IDSet.get(new Random().nextInt(IDSet.size())));

查看docs 了解更多信息。

返回一个伪随机、均匀分布的 int 值介于 0(包括)和指定值(不包括)之间,取自此随机数生成器的序列。


如果您正在考虑使用数据库查询解决方案

使用ORDER BY RANDOM()(众所周知,随着表中行数的增长不能很好地扩展)的更好替代方法是让SQLite 使用OFFSET 返回随机行。

首先将总行数保存num某处。

SELECT COUNT(*) AS num FROM spells;

然后使用Random(0, num)之间选择一个随机数rnum并使用查询

SELECT * FROM spells LIMIT 1 OFFSET rnum;

【讨论】:

  • 但是我的数据库中的记录数不是恒定的。以这种访问数据库的方式,游标的getCount()是否有等价物?
  • spellId 是表的主键,还是像获取的数据库记录列表中的索引一样工作?
  • 是的。我使用上一个活动中的 Bundle 来获取它。
  • 我也刚刚添加了一个数据库查询解决方案。
  • 不客气,Suika。如果您愿意,请也投赞成票:)
猜你喜欢
  • 1970-01-01
  • 2018-06-06
  • 2011-07-17
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 2012-04-21
  • 1970-01-01
相关资源
最近更新 更多