Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 核心数据中获取的属性返回不正确的计数_Ios_Macos_Core Data_Ios5_Fetched Property - Fatal编程技术网

Ios 核心数据中获取的属性返回不正确的计数

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->>ItemB

其中as itemA有许多itemB。我想使用一个fetched属性,它允许我获取所有与itemA相关联的itemB,而itemA的int32 status属性设置为“2”。因此,我在data modeler中创建了一个获取属性,该属性具有以下内容:

获取的属性:completedItem 谓词:status==2 目的地:itemB

当我第一次尝试它时,我得到了项目,我认为这一切都很酷,然后我注意到奇怪的行为,当我仔细观察它返回的项目时,它没有处理与itemA对象关联的itemB的实际数量。更奇怪的是,返回类型是NSFaultingMutableArray。这里有一个简单的例子

  • ItemA有0个itemB
  • NSSet属性ItemA上的筛选谓词搜索具有的ItemB返回0
  • 获取的属性“completedItem”返回ItemB的4
  • 它返回的类型是NSFaultingMutableArray
这在我脑子里是很奇怪的,真的没有意义。有什么想法吗

更新1:


此处列出的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添加谓词的漂亮小类别: