2

我目前的 CoreData 实现有问题。我尝试查询具有某些属性的对象的数量。因此,我执行以下代码

NSUInteger itemsCount = [managedObjectContext countForFetchRequest:fetchRequest error:NULL];
NSLog(@"%i",(int)itemsCount);

到目前为止,一切都很好。如果我使用一个从未保存过数据的新 MOC,一切都会正常工作。当我执行以下操作时会出现问题:

  • 我保存了整个 MOC
  • 从 MOC 中删除与获取条件匹配的对象之一(不保存!)
  • 重新查询符合条件的对象数

尽管我删除了其中一个对象,但对象的数量没有改变。我还尝试了以下查询...

fetchRequest.resultType = NSCountResultType;
NSArray* array = [managedObjectContext executeFetchRequest:fetchRequest error:&fetchError];
NSLog(@"%i",[[array firstObject] intValue]);

......结果相同。

然后我尝试直接查询对象...

fetchRequest.resultType = NSManagedObjectResultType;
array = [managedObjectContext executeFetchRequest:fetchRequest error:&fetchError];
NSLog(@"%i",(int)[array count]);

... tada:在这里它有效。该数组不包含已删除的对象。当我设置 fetchRequest.includesPendingChanges = NO 时,我当然会得到所有对象,因为我还没有保存。但是,该属性对前两个查询没有影响,因为它们首先显示了太多对象。

所以我的问题是,我做错了什么,为什么一旦我将它们保存到持久性存储中就无法获得正确数量的对象。保存后必须重置MOC吗?

-------------------------------------------------- ------------------------------

更新

我进一步搜索了类似的问题,发现了一些有趣的帖子。从 MOC 获取对象也意味着查询持久存储。由于我没有立即保存更改,因此我会分别获取或不获取已删除和新插入的对象。但奇怪的是,这只适用于涉及字典结果类型或计数获取的查询。当查询对象本身时,我检索正确数量的对象,包括新插入的对象和没有删除的对象。

现在我想知道如何处理我的问题。我有一个表格视图,可以与 NSFetchedResultsController (NSFRC) 顺利配合使用。我不必保存任何更改,因为控制器会处理所有更新并通知我。但是一旦我插入或删除数据并且 NSFRC 通知我,我想做进一步的计算来更新我的其他视图。这些计算包括具有特定属性的对象的平均值和数量等。现在,只要调用插入或删除委托方法,我就会更新这些视图。但是这些查询不会返回正确的值。在查询之前调用以下内容对这些查询没有影响。

[moc processPendingChanges]
fetch.includePendingChanges = YES

显然我的方法缺少一些东西。我如何正确获取我需要的值?由于我的 NSFRC 显然会跟踪删除和插入的值,我很好奇它是否有助于创建第二个 NSFRC 来获取平均值等等?它甚至有能力吗?

谢谢!

4

0 回答 0