Ios 核心数据中获取的属性返回不正确的计数
我的核心数据关系如下所示 ItemA->>ItemB 其中as itemA有许多itemB。我想使用一个fetched属性,它允许我获取所有与itemA相关联的itemB,而itemA的int32 status属性设置为“2”。因此,我在data modeler中创建了一个获取属性,该属性具有以下内容: 获取的属性:completedItem 谓词:status==2 目的地:itemB 当我第一次尝试它时,我得到了项目,我认为这一切都很酷,然后我注意到奇怪的行为,当我仔细观察它返回的项目时,它没有处理与itemA对象关联的itemB的实际数量。更奇怪的是,返回类型是NSFaultingMutableArray。这里有一个简单的例子Ios 核心数据中获取的属性返回不正确的计数,ios,macos,core-data,ios5,fetched-property,Ios,Macos,Core Data,Ios5,Fetched Property,我的核心数据关系如下所示 ItemA->>ItemB 其中as itemA有许多itemB。我想使用一个fetched属性,它允许我获取所有与itemA相关联的itemB,而itemA的int32 status属性设置为“2”。因此,我在data modeler中创建了一个获取属性,该属性具有以下内容: 获取的属性:completedItem 谓词:status==2 目的地:itemB 当我第一次尝试它时,我得到了项目,我认为这一切都很酷,然后我注意到奇怪的行为,当我仔细观察它返回的项目时,它
- ItemA有0个itemB
- NSSet属性ItemA上的筛选谓词搜索具有的ItemB返回0
- 获取的属性“completedItem”返回ItemB的4
- 它返回的类型是NSFaultingMutableArray
此处列出的fetched属性似乎获取了核心数据必须提供的与谓词匹配的所有ItemB对象,即使它与所讨论的ItemA没有关联 我们有一个ClassA的objectA 我们有一些B类的对象(未命名) 我们已经将ClassB对象添加到objectA objectA是对NSManagedObject的子类的引用。。。 调用objectA.completeItem时,要求objectA提供项B的集合, 这将起作用,因为您正在处理内存中的一个实例 创建新的NSManagedObjectContext并在其中执行提取时,它对objectA或其关系一无所知,除非在执行提取之前对objectA的上下文执行保存 编辑: 为了使谓词仅过滤出ItemA拥有的classB对象,可以使用如下谓词(假设ItemA是ItemA cpmletedItem关系的倒数)
[NSPredicate谓词格式:@“itemA=%@”,itemA]代码>凯尔,问题是核心数据试图比你更聪明。如果您不打算使用数据存储中的所有对象,则核心数据不希望用它们填满您的内存。因此,它不是一直创建真实对象,而是创建“错误”。错误是真实对象的占位符,当您请求这些对象时,核心数据将在此时填充这些对象
我的最佳猜测是,您在ItemA.ItemB属性上的搜索没有实现链接对象,因此您将返回0集。如果您刚刚做了一个NSSet*mySet=ItemA.ItemB,我相信您会看到mySet包含了正确的对象计数。但是对ItemA.ItemB进行计数是将计数消息发送到一个故障集,因此返回0
当您使用completedItems属性时,CoreData似乎至少在做一些事情来返回正确数量的对象,但还没有返回实际的对象数据。以下是解决此问题的答案—本期中的所有奇怪之处:
1) 获取的属性实际上并没有仅为ItemA返回ItemB对象。为了实现这一点,您必须在fetchedproperties谓词中添加类似的内容
status == 2 AND ItemA == $FETCH_SOURCE
2) 从获取的属性文档中:
获取的属性将被延迟计算,并随后被缓存
如果目标实体中的对象发生更改,则必须重新评估获取的属性,以确保它是最新的。您可以使用refreshObject:mergeChanges:手动刷新属性,这将导致在下次触发对象错误时再次执行与此属性关联的获取请求
因此,基本上使用手动刷新对象以重新加载获取的属性。您可以通过添加一个refresh方法或者在子类NSManagedObject中对KVC get方法进行一些奇特的重写来实现这一点
也就是说,这里的其他人(Rob Booth,Grady玩家)完全绕过获取的属性,有其他有效的解决方案。虽然这些是faril有点混淆了这意味着什么,尽管看起来更深入地研究了它,但fetched属性正在计算ItemB中已完成==2的所有对象。而filtered属性首先获取ItemA的所有ItemB项,然后对其进行筛选。奇怪…非常正确,但是我如何从获取的属性中做到这一点。老实说,如果我不能从一个取回的财产中得到它,为什么他们会有呢?再见!在文档中找到了答案,事实上,这些文档在理解文档方面帮助了我更多,当我是doneHi Rob时,它们会更新我的主要帖子!不过,更深入地研究一下,它看起来像是在计算数据库中与谓词匹配的所有ItemB对象。因此,您有3个ItemB与谓词匹配,但其中只有2个链接到ItemA,您希望返回2个对象,但返回3个。我说的对吗?如果是这样的话,我认为问题在于fetched属性没有考虑到您的项关系,只是在做可以被视为子查询的事情。尝试将您的关系值添加到谓词status==2&&itemA==$FETCH\u SOURCE?只要你有适当的反向关系设置,这应该是可行的。在查看更多获取的属性时,我认为这并不是你真正要做的事情。我建议您只需提取所有链接的ItemB,然后通过谓词运行它。您可以使用ItemA的自定义NSManagedObject执行此操作,也可以在事后手动执行。下面是一个向NSSet添加谓词的漂亮小类别: