2012-01-26 40 views
0

这是一个更具有核心数据的通用设计查询,以及如何设计它以使其高效。核心数据 - 如何进行复杂的随机获取

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

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

此外,我正在尝试这样做,因为我的应用程序正在加载在AppDelegate前端。

我想到这个问题做了一些方法,但确实需要你的意见:

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

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

  3. 取随机发言权基于随机索引500分的记录,并且希望这包含每个长度至少10个字。

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

在此先感谢。 Pras。

回答

0

我想我已经通过一些测试找到了自己的答案。方法(1)显然是一种简单的方法,但是太耗费资源来获取和存储海量数据。方法(3)只是愚蠢的。

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

的方法如下:

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

虽然并不是完全随机,上述方法是快速,并返回10个顺序值,从随机偏移,并将其存储到一个NSMutableArray里。

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

任何其他的建议表示欢迎。 Pras。

0

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

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

这样,您不是检索所有对象,而只检索一个子集,并且只检索一个。费用是修改你的字典来保存一个预先计算好的索引,并且你需要在某个地方跟踪Imaxes,但是如果你的字典变化不大,那么你只需要索引一次(并且添加后续的单词应该是不会那么贵)。