【发布时间】:2023-03-15 04:53:01
【问题描述】:
我有一个 NSFetchedResultsController,它在 UITableView 中显示数据。在选择创建 Core Data 项目时,我使用的是 Xcode 提供的样板代码。我在 NSFetchedResultsController 使用的 NSFetchRequest 中添加了以下谓词(在 NSFetchedResultsController 初始化之前):
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"deleted == NO"];
[fetchRequest setPredicate:predicate];
现在在我的应用程序的另一个位置,我像这样设置已删除的属性(伪代码):
myManagedObject.deleted = YES
saveDataContext
当我返回 TableViewController 时,它仍然显示这个“已删除”的行。
当我尝试重新加载表格视图时,没有任何反应。
当我尝试使用 performFetch 重新加载 fetchedResultsController 时,它显示:
'致命错误:部分信息的持久缓存与当前配置不匹配。你非法改变了 NSFetchedResultsController 的获取请求、谓词或排序描述符,而没有禁用缓存或使用 +deleteCacheWithName:'
如果我删除缓存,在 init 方法中,调用performFetch,然后调用[myTable reloadData] 就可以了。
难道没有更简单的方法来刷新数据吗?最好是允许您使用 NSFetchedResultsController 的缓存功能的一种?
据我所知,我修改获取请求、谓词或排序描述符的唯一位置是在分配和初始化 NSFetchedResultsController 的同一方法中,因此它显示的错误消息似乎不正确。
更新:现在我对NSFetchedResultsController 有了更好的理解,我知道它不会自动为您删除行,主要负责删除的是controller:didChangeObject:atIndexPath:forChangeType:nowIndexPath: 方法行。我实现了这个方法,因为我的项目使用了 Apple 的模板。
但是,就我而言,我实际上并没有删除一个项目,我只是更新了一个属性 (deleted) 以指定该项目不应再存在于列表中。这意味着controller:didChangeObject:atIndexPath:forChangeType:nowIndexPath: 方法的更改类型是NSFetchedResultsChangeUpdate 而不是NSFetchedResultsChangeDelete。我将代码更新为:
case NSFetchedResultsChangeUpdate: {
MyObj *obj = (MyObj *)anObject;
if (obj.deletedValue) { // NOTE: deletedValue returns the deleted property as BOOL
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
} else {
[self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
break;
}
}
问题在于我收到错误消息:
无效更新:第 0 节中的行数无效。更新 (3) 后现有节中包含的行数必须等于更新前该节中包含的行数 (3),加上或减去从该部分插入或删除的行数(插入 1 行,删除 2 行)。与 userInfo (null)
基本上是抱怨 NSFetchedResultsController 中的对象数量和表格中的单元格数量不同步。
希望这样可以更清楚:
// DB Items (Name, Deleted):
[Foo, NO]
[Bar, NO]
[Baz, NO]
// mark one as deleted
Objects[1].deletedValue = YES;
// DB items now look like so:
[Foo, NO]
[Bar, YES]
[Baz, NO]
即使 NSFetchedResultsController 的 NSFetchRequest 的 NSPredicate 设置为 deleted == NO,NSFetchedResultsController 仍然看到 3 个项目而不是 2 个。
我该如何解决这个问题?我需要以某种方式刷新 NSFetchedReultsController 吗?还有什么问题?
【问题讨论】:
-
我也面临同样的问题,虽然我没有使用任何保留字如删除。还有其他可能吗?
标签: objective-c cocoa-touch core-data nsfetchedresultscontroller nspredicate