0

我有很多单词(现在大约 200 个),我想每天随机显示而不重复。

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

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

方法一:使用sqlite db

  • 在 assets 文件夹中预填充一个 db(db 有一个包含两列的表,words 和 isUsed)
  • onCreate(SQLiteDatabase 数据库) 将预填充的数据库复制到 /data
  • 使用 sqlite 从 db 获取随机条目并将其 isUsed 计算机更新为 true
  • 在共享偏好中刮掉这个词,这样如果用户在同一天再次打开应用程序,然后显示这个词
  • 如果我必须更新 db 中的单词然后(150):
    • 用新词在资产文件夹中创建另一个数据库
    • onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 将此数据库复制到 /data
    • 逐行复制原始数据库中的每个单词,保持 isUsed 列不变

我可以在 oncreate 中使用 SQL 语句插入 200 个单词,而不是使用预填充的 db,然后在 onUpgrade 中使用 sql 语句更新其他 150 个单词。

方法 2:使用共享首选项

  • 用来节省200字
  • 创建一个随机数最多为 200 的字符串并将其保存在共享首选项中
  • 每天弹出一个随机数并显示带有该索引的单词。如果是同一天,则不要弹出但显示最后一个字
  • 如果我必须更新单词(150):
    • 检查单词数量增加了多少,并以随机顺序生成这些增加的数字,并将其洗牌回原始随机字符串数组

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

4

2 回答 2

1

为什么不在/assets期间从简单的文本文件中加载字符串,将它们打乱并插入数据库?然后,当您需要知道要显示哪个单词时,只需计算应用程序安装的天数 (N) 并显示第 N 个单词。onCreateonUpgrade

于 2013-08-16T05:43:17.773 回答
0

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

应避免 onCreate 中的任何大型任务,因为它会滞后于您的应用程序。如果您以后需要增加字数,SQLLite db 会很有帮助。

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

于 2013-08-16T05:57:53.597 回答