从核心数据存储中选择随机条目

Posted

技术标签:

【中文标题】从核心数据存储中选择随机条目【英文标题】:Selection of random entries from a Core Data Store 【发布时间】:2009-07-13 09:52:26 【问题描述】:

有没有办法从 Core Data 存储中选择固定数量的随机条目?我刚刚开始使用 Core Data,并且已经在这个问题上停留了很长一段时间。

作为最后的手段,我可​​以在内存中查询大量条目,然后随机选择一个固定数字。

另外,有没有办法指定要在核心数据存储上执行的自定义 SQL 语句?我意识到这不太可能,因为商店的底层实现也可能是一个 XML 文件。

【问题讨论】:

【参考方案1】:

嗯……也许

[[[managedObjectsContext registeredObjects] allObjects] objectsAtIndex:r]

其中 r 是介于 0 和对象数减一之间的随机整数?一点也不高效,但又快又容易。

编辑:如果您想在选择的对象之间选择随机对象,则创建一个描述您的对象选择的提取请求,并对查询结果执行与上述相同的操作:

[[[managedObjectsContext executeFetchRequest:request error:&error] objectAtIndex:r]

【讨论】:

并非我商店中的所有托管对象都属于同一类型。我想要一个特定类型的随机条目。在所有注册对象中选择一个随机对象可能不起作用。我在我的条目中使用身份字段。幸运的是,我知道没有缺少身份值。我只是随机选择身份值并使用相同的值指定一个 NSPredicate 。虽然这目前有效,但必须有更好的方法。不过感谢您的帮助。【参考方案2】:

关于您的第二个问题,这是核心数据的要点之一,即抽象出底层数据存储。使用 NSPredicate 和 NSExpressions 构建获取请求,或者将其存储在数据模型中是查询存储的唯一方法。

【讨论】:

【参考方案3】:

不确定,但我认为 Core Data 会为您将数据放入 NSSet。所以你也许可以使用 -[NSSet anyObject]。我还没有测试过这个或任何东西。

【讨论】:

-anyObject 从开发人员的角度来看是随机的,因为您无法控制它,但实际上它只是内部数据存储根中的任何对象,因此它将始终如一相同的对象,直到集合的内容发生变化。

以上是关于从核心数据存储中选择随机条目的主要内容,如果未能解决你的问题,请参考以下文章

性能优化——存储性能优化

核心数据:基于 NSDate 的时间分量过滤条目

iCloud 同步 - 核心数据重复条目(绝望的帮助)

核心数据,排序搜索——有可能吗?

从特定的核心数据表行中检索值 - 然后将值存储到 UserDefaults

如何删除核心数据中的条目