我目前在使用CoreData时出现问题。我尝试查询具有某些属性的对象数。因此,我执行以下代码
NSUInteger itemsCount = [managedObjectContext countForFetchRequest:fetchRequest error:NULL];
NSLog(@"%i",(int)itemsCount);
到目前为止一切顺利。如果我使用没有保存数据的新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只是为了获取平均值等等?它甚至能够做到吗?
谢谢!