Android 每天从池中获取唯一的随机单词

Android 每天从池中获取唯一的随机单词,android,Android,我有一个单词库(现在大约200个),我想每天随机显示,不重复 在共享首选项中,我存储上次显示的单词的日期,如果今天的日期相同,我显示上次显示的单词,今天是另一天,我需要从池中获取另一个随机单词并显示它 我试图通过两种方法实现这一点: 方法1:使用sqlite数据库 在资产文件夹中预填充数据库(数据库有一个包含两列的表,即Word和isUsed) 在onCreate(SQLiteDatabase)上,将预填充的数据库复制到/data 使用sqlite从db获取一个随机条目,并将其isUsed c

我有一个单词库(现在大约200个),我想每天随机显示,不重复

在共享首选项中,我存储上次显示的单词的日期,如果今天的日期相同,我显示上次显示的单词,今天是另一天,我需要从池中获取另一个随机单词并显示它

我试图通过两种方法实现这一点:

方法1:使用sqlite数据库

  • 在资产文件夹中预填充数据库(数据库有一个包含两列的表,即Word和isUsed)
  • 在onCreate(SQLiteDatabase)上,将预填充的数据库复制到/data
  • 使用sqlite从db获取一个随机条目,并将其isUsed couter更新为true
  • 在共享首选项中删除此单词,以便如果用户在同一天再次打开应用程序,则显示此单词
  • 如果我必须更新db中的单词,则(以150为单位):
    • 在assets文件夹中创建另一个包含新词的db
    • onUpgrade(SQLITEDABASE db,int oldVersion,int newVersion)将此数据库复制到/data
    • 逐行复制原始数据库中的每个单词,保持isUsed列的完整性
我可以在oncreate中使用SQL语句插入200个单词,然后在onUpgrade中使用SQL语句更新其他150个单词,而不是使用预填充的db

方法2:使用共享首选项

  • 用于保存200个单词
  • 创建一个随机数不超过200的字符串,并将其保存在共享首选项中
  • 每天弹出一个随机数,并用该索引显示单词。如果是同一天,则不要突然出现,而是显示最后一句话
  • 如果我必须更新单词(150个):
    • 检查字数增加多少,并以随机顺序生成这些增加的数字,然后将其重新洗牌到原始随机字符串数组

所以我的问题是我觉得这些算法都不够好。有没有更好的方法来实现这一点?如果没有,我应该使用方法1,方法1,但不使用预填充的db或方法2?

为什么不在
onCreate
/
onUpgrade
期间,从
资产中的简单文本文件加载字符串,然后将其洗牌并插入数据库?然后,当您需要知道显示哪个单词时,只需计算从应用程序安装开始的天数(N)并显示第N个单词。

我觉得带有预填充表格的方法1是最佳选择。这将在可扩展性和随机性方面帮助您

应该避免onCreate中的任何大型任务,因为它会延迟应用程序。如果以后需要增加字数,SQLLite数据库将非常有用


kriomant建议的方法是好的,但滞后于随机性的自由度。如果有人坐下来试着读,我们可以在两个完整的周期后预测文本:-)

这对我来说是最好的解决方案。我可以使用OrderByRandom,其中isUsed=0;sqlite stmt用于随机单词。如果某一天没有使用该应用程序怎么办?该单词未被使用,但仍然不可用。然后,当下一个单词显示给用户时,只需手动增加N:-)@amol,在这种情况下,您不需要
isUsed
。只有一个数字。@kriomant with is used下一次我怎么能不显示一个呢?因为有限制,单词不能重复显示,在这两种情况下,都有显示所有单词的时刻。在您的情况下,您必须重置“isUsed”,在我的情况下,您只需重新排列单词并设置N=0。您的方法在列表末尾保存了一些处理周期,是的。:-)