基于数组属性大小的 NSFetchRequest

Posted

技术标签:

【中文标题】基于数组属性大小的 NSFetchRequest【英文标题】:NSFetchRequest based on array property size 【发布时间】:2017-08-24 07:13:02 【问题描述】:

我有一个NSManagedObject,它有一个(可转换的)NSArray 属性arrayProperty

我想对属性大小小于 5 的对象执行 fetch 请求过滤。我试过了

[NSPredicate predicateWithFormat:@"arrayProperty.@count <= 5"]

[NSPredicate predicateWithFormat:@"arrayProperty[SIZE] <= 5"]

但它们都不起作用(给Unsupported function expression countUnsupported function [SIZE])。

有没有办法做到这一点?

【问题讨论】:

如果您从 SQLite 存储中获取则不会:可转换存储为 blob - CoreData 无法将您的谓词转换为可以分析 blob 的 SQL where 子句。要么获取所有内容并在内存中过滤,要么检查您的数组是否实际上应该建模为一对多关系。 【参考方案1】:

这种事情对于可变形的属性是不可能的。 Transformable 可以方便地存储数据,但是一旦它们被存储,它们就是这样——一堆字节,没有关于创建它们的数据结构的信息。 SQLite 不知道它是一个数组,所以它不能做诸如计算数组中有多少项之类的事情。

如果您使用可转换属性,您将失去任何基于它们进行过滤的能力,除非是非常基本的测试,例如值是否为 nil。

如果您需要进行此类过滤,则需要考虑如何更改数据模型。一种可能性是,不保存数组,而是创建一个具有一对多关系的新实体来存储值。

【讨论】:

谢谢。这就是我的想法,但在任何地方都找不到。将 NSNumber* arrayCount 添加到我的模型中...

以上是关于基于数组属性大小的 NSFetchRequest的主要内容,如果未能解决你的问题,请参考以下文章

Java 实例变量数组大小基于另一个实例变量

ArrayList源码分析(基于JDK1.8)

GLSL 每个顶点固定大小的数组

JAVA如何比较两数组大小

2017-5-30引用类型之Aray数组

基于对象属性的子数组过滤数组