在SQLite中获取随机记录

5

我这样从SQLite数据库中获取记录。

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

我能否在不使用原始查询和游标的情况下获取像这样的随机数据?


可能是从SQLite表中选择随机行的重复问题。 - Gopal00005
2个回答

13

试试这样:

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

这个方法可以实现,但不建议在大表中使用。Order By Random() 在处理行数较多的情况下性能不佳。 - Ravi K Thapliyal

3
您可以使用 Random#nextInt() 来进行操作。
String[] data = db.getRecord(new Random().nextInt(num));

这段文本涉及到IT技术,介绍了如何确定 num 在记录ID范围内的方法。如果您的ID不是连续的,则需要针对性地调整此解决方案。

为了实现这一目标,您可以首先创建一个查询,以获取所有主键并将这些值存储在某个集合中。然后使用 Random 生成索引来选择一个随机的键。

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

请查看文档以获取更多信息。

返回一个伪随机的、均匀分布的int值,在0(包含)和指定值(不包含)之间,从此随机数生成器的序列中绘制。

如果你考虑使用DB查询解决方案

使用ORDER BY RANDOM()不是一个很好的选择(随着表中行数的增加,它已知不会扩展得很好),而是使用OFFSET让SQLite返回一行随机行。

首先将总行数num保存在某个地方。

SELECT COUNT(*) AS num FROM spells;

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

SELECT * FROM spells LIMIT 1 OFFSET rnum;

但是我的数据库中的记录数量并不是恒定的。在访问数据库的这种方式中,是否有类似于游标的getCount()的等效方法? - Suika
spellId 是该表的主键还是像在获取数据库记录列表时的索引一样工作? - Ravi K Thapliyal
是的。我使用前一个活动中的Bundle获取它。 - Suika
我刚刚也添加了一个数据库查询解决方案。 - Ravi K Thapliyal
不客气,Suika。如果您愿意的话,也请点个赞吧 :) - Ravi K Thapliyal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接