在SQLite中获取随机记录

时间:2015-01-31 07:05:52

标签: android sqlite random

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

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

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

2 个答案:

答案 0 :(得分:5)

尝试这样:

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

答案 1 :(得分:3)

您可以使用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;

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

SELECT * FROM spells LIMIT 1 OFFSET rnum;