只是遇到了一个棘手的NSFetchedResultsController问题。
下面的代码在所有情况下都工作得很好,除了Core Data数据库的第一个条目报告2行之外!
id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
numberOfRows = [sectionInfo numberOfObjects];如果添加其他条目,则会正确报告这些条目。如果我同时删除两个初始行,它就能正常工作。
有什么建议吗?如果有任何帮助,可以使用:
-com.apple.CoreData.SQLDebug 1我可以看到有1个插入和2个选择。
而且,如果我已经访问过包含NSFetchedResultsController代码的视图(即在执行插入之前),这个问题似乎不会发生。
====
更新1:
不知道这段代码的遍历是否会有帮助...
下面是importerDidSave代码的相关部分(这项技术就是从这里获得的):
- (void)importerDidSave:(NSNotification *)saveNotification {
NSLog(@"In importerDidSave...");
if ([NSThread isMainThread]) {
NSLog(@"... on Main Thread.");
NSLog(@"Number of NSFetchedResultsController rows BEFORE: %d", [[[fetchedResultsController sections] objectAtIndex:0] numberOfObjects]);
[self.managedObjectContext mergeChangesFromContextDidSaveNotification:saveNotification];
NSLog(@"Number of NSFetchedResultsController rows AFTER: %d", [[[fetchedResultsController sections] objectAtIndex:0] numberOfObjects]); 以下哪项输出:
... on Main Thread.
Number of NSFetchedResultsController rows BEFORE: 1
Number of NSFetchedResultsController rows AFTER: 3发布于 2010-07-24 21:27:28
不要依赖直接的SQL调试。核心数据对SQL的使用隐藏在对象之后(它甚至不会一直使用SQL ),以至于您无法通过查看SQL来判断对象图的状态。
最有可能的情况是,部分中有两个对象,但一个在内存中,另一个在持久化存储中。只有持久化对象在SQL调试中才是明显的。您可以在图形中有数千个对象,在一个表节中有数千行,但是在持久化这些对象之前,它们不会显示在SQL中。此外,SQL的插入和删除模式不会直接反映对象图的插入和删除。
简而言之,SQL调试对于调试核心数据非常无用,在绝大多数情况下您应该忽略它。
如果抓取的结果控制器报告该节中有两个对象,那么该节中就有两个对象。在没有更多信息的情况下,我不能说额外的物体来自哪里。
检查:
您可以通过手动执行与FRC使用的相同的fetch并查看返回的内容来确认FRC是否正确。对每个区段键的返回值进行排序,您可以看到有多少对象出现在区段中。
发布于 2010-07-23 23:24:07
这个代码是正确的。我会看看您将数据添加到存储中的方式。
https://stackoverflow.com/questions/3319562
复制相似问题