首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSFetchedResultsController -幻象行

NSFetchedResultsController -幻象行
EN

Stack Overflow用户
提问于 2010-07-23 23:18:50
回答 2查看 388关注 0票数 1

只是遇到了一个棘手的NSFetchedResultsController问题。

下面的代码在所有情况下都工作得很好,除了Core Data数据库的第一个条目报告2行之外!

代码语言:javascript
复制
id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
numberOfRows = [sectionInfo numberOfObjects];

如果添加其他条目,则会正确报告这些条目。如果我同时删除两个初始行,它就能正常工作。

有什么建议吗?如果有任何帮助,可以使用:

代码语言:javascript
复制
  -com.apple.CoreData.SQLDebug 1

我可以看到有1个插入和2个选择。

而且,如果我已经访问过包含NSFetchedResultsController代码的视图(即在执行插入之前),这个问题似乎不会发生。

====

更新1:

不知道这段代码的遍历是否会有帮助...

  1. ViewController A启动后台NSOperation,这将执行下载
  2. 当此操作完成后,它会向AppDelegate发送一个通知,该通知将导入数据(执行检查以确保数据在执行此操作之前位于主线程上)

下面是importerDidSave代码的相关部分(这项技术就是从这里获得的):

代码语言:javascript
复制
- (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]);  

以下哪项输出:

代码语言:javascript
复制
... on Main Thread.  
Number of NSFetchedResultsController rows BEFORE: 1  
Number of NSFetchedResultsController rows AFTER: 3
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-24 21:27:28

不要依赖直接的SQL调试。核心数据对SQL的使用隐藏在对象之后(它甚至不会一直使用SQL ),以至于您无法通过查看SQL来判断对象图的状态。

最有可能的情况是,部分中有两个对象,但一个在内存中,另一个在持久化存储中。只有持久化对象在SQL调试中才是明显的。您可以在图形中有数千个对象,在一个表节中有数千行,但是在持久化这些对象之前,它们不会显示在SQL中。此外,SQL的插入和删除模式不会直接反映对象图的插入和删除。

简而言之,SQL调试对于调试核心数据非常无用,在绝大多数情况下您应该忽略它。

如果抓取的结果控制器报告该节中有两个对象,那么该节中就有两个对象。在没有更多信息的情况下,我不能说额外的物体来自哪里。

检查:

  1. 你的区段密钥如果有的话。如果你的部分配置错误,你将会有一些你不需要的行。
  2. 检查您的插入内容,查看是否正在复制插入内容。

您可以通过手动执行与FRC使用的相同的fetch并查看返回的内容来确认FRC是否正确。对每个区段键的返回值进行排序,您可以看到有多少对象出现在区段中。

票数 0
EN

Stack Overflow用户

发布于 2010-07-23 23:24:07

这个代码是正确的。我会看看您将数据添加到存储中的方式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3319562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档