【发布时间】: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();
我可以在不使用原始查询和游标的情况下获得这样的随机数据吗?
【问题讨论】:
我像这样在我的 SQLite 数据库中获取记录。
spellId = extra.getString("spellId");
DBase db = new DBase(this);
db.open();
String[] data = db.getRecord(Integer.parseInt(spellId));
db.close();
我可以在不使用原始查询和游标的情况下获得这样的随机数据吗?
【问题讨论】:
试试这样:
db.rawQuery("SELECT * FROM mainTable ORDER BY RANDOM() LIMIT 1", null);
【讨论】:
Order By Random() 不能很好地随行数扩展。
你可以用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;
【讨论】:
spellId 是表的主键,还是像获取的数据库记录列表中的索引一样工作?