核心数据 - 如何进行复杂的随机获取

时间:2012-01-26 13:07:30

标签: iphone mysql objective-c core-data

这更像是使用Core Data的一般设计查询,以及如何设计它以使其高效。

我的应用程序是一个文字游戏,带有一个sqlite3数据库,其中包含2到28个字母单词的单词字典。数据库包含单词和单词大小的列。

我想得到的结果(以及我想设计的查询)是获取每个大小的10个随机单词,即10个随机2个字母单词,10个随机3个字母单词,依此类推。

此外,我正在尝试在我的应用程序加载时在AppDelegate中执行此操作。

我想过几个方面,但真的需要你的意见:

  1. 获取特定大小的所有字母,然后在结果中获取随机记录。这意味着每个字长有多次提取,并存储大量数据。

  2. 使用索引上的偏移量获取随机单词,即0 - 20 = 2个字母单词,21 - 972 = 3个字母单词

  3. 根据随机索引随机抽取500条记录,并希望每条长度至少包含10个单词。

  4. 我不确定如何有效地设计查询。我试图坚持单次获取的规则,并尽可能地对数据进行排序。

    提前致谢。 PRAS。

2 个答案:

答案 0 :(得分:0)

我想我通过一些测试找到了自己的答案。

方法(1)显然是一种简单的方法,但是对于获取和存储大量数据而言,资源过于密集。

方法(3)真是太傻了。

所以我选择了方法(2)和一些新获得的核心数据技能。

方法如下:

  1. 设置我的方法作为后台线程运行
  2. 以标准方式设置NSFetchRequest,NSManagedObjectContext和NSEntityDescription。
  3. 将我的谓词应用于请求,例如所有长度为2的单词
  4. 使用谓词
  5. 获取值的计数(使用countForFetchRequest :)
  6. 随机化偏移值(我知道每个长度的偏移量(硬编码),然后我将其添加到(arc4random%count value) - 确保在接近最大计数时检查我的随机偏移值是否可以旋转,例如count = 22,random offset = 21)
  7. 设置提取限制以返回少量结果,例如10。
  8. 执行获取请求
  9. 存储结果
  10. 虽然不是完全随机的,但上面的方法是快速,并从随机偏移返回10个连续值,并将其存储到NSMutableArray。

    更新实际代码和详细说明可以在我的教程页面找到:http://prasannaellanti.com/tutorials/

    欢迎任何其他建议。 PRAS。

答案 1 :(得分:0)

如果您的词典是相对静态的,请预先计算各种长度的单词数。为每个单词保留一个自定义ID字段,将其标识为长度为L的单词的实例I.例如,单词“foo”可以是长度为3的单词的实例638,“fop”为639等等。

从这些范围生成随机索引(只是随机样本而不替换给定L的1和I [max]之间的数字),将它们放入NSSet并使用该集合应用谓词。

这样,您不会检索所有对象,而只检索一个子集,并且只需一次提取。费用是修改你的字典以保存预先计算的索引,并且你想要在某处跟踪Imaxes,但是如果你的字典没有太大变化,那么你只需要做一次索引(并且添加后续的单词应该是更便宜)。