【问题标题】:Core Data - How to carry out complex random fetchCore Data - 如何进行复杂的随机获取
【发布时间】:2012-01-26 13:07:29
【问题描述】:

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

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

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

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

我想过这样做的几种方法,但真的需要你的意见:

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

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

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

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

提前致谢。 普拉斯。

【问题讨论】:

    标签: iphone mysql objective-c core-data


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      方法 (1) 显然是一种简单的方法,但过于耗费资源,无法获取和存储大量数据。

      方法(3)很傻。

      所以我选择了方法 (2) 和一些新获得的 Core Data 技能。

      方法如下:

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

      虽然不是完全随机的,但上面的方法快速,从一个随机偏移量返回10个连续值,并将其存储到一个NSMutableArray中。

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

      欢迎提出其他建议。 普拉斯。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多