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

Iphone 核心数据-如何进行复杂的随机提取,iphone,mysql,objective-c,core-data,Iphone,Mysql,Objective C,Core Data,这更像是一个具有核心数据的通用设计查询,以及如何设计它以使其高效 我的应用程序是一个文字游戏,有一个sqlite3数据库,里面有一个由2-28个字母组成的单词组成的字典。数据库中有用于单词和单词大小的列 我想要得到的结果(以及我想要设计的查询)是获取每种大小的10个随机单词,即10个随机2字母单词、10个随机3字母单词等等 此外,在加载应用程序时,我正在尝试在AppDelegate中提前执行此提取 我考虑过几种方法,但真的需要你的意见: 获取一定大小的所有字母,然后获取结果中的随机记录。这意味着

这更像是一个具有核心数据的通用设计查询,以及如何设计它以使其高效

我的应用程序是一个文字游戏,有一个sqlite3数据库,里面有一个由2-28个字母组成的单词组成的字典。数据库中有用于单词和单词大小的列

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

此外,在加载应用程序时,我正在尝试在AppDelegate中提前执行此提取

我考虑过几种方法,但真的需要你的意见:

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

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

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

  • 我不知道如何有效地设计查询。我试图坚持单次提取的规则,并尽可能多地对数据进行排序

    提前谢谢。
    Pras.

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

    方法(1)显然是一种简单的方法,但资源太密集,无法获取和存储大量数据

    方法(3)太傻了

    因此,我选择了方法(2)和一些新获得的核心数据技能

    方法如下:

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

    更新:可在我的教程页面上找到实际代码和详细说明:

    欢迎提出任何其他建议。
    Pras.

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

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

    这样,您就不会检索所有对象,而是只检索一个子集,只需一次获取。费用是修改字典以保存预计算的索引,并且您希望在某个地方跟踪IMAX,但是如果字典没有太大变化,那么您只需要做一次索引(并且添加后续单词的成本应该更低)