Core data 传递给ViewController的NSManagedObject不反映所有更新
在我的第一个视图控制器中,我要做的是从viewDidLoad中的UIMangedDocument设置NSManagedObjectContextCore data 传递给ViewController的NSManagedObject不反映所有更新,core-data,nsfetchedresultscontroller,nsmanagedobjectcontext,Core Data,Nsfetchedresultscontroller,Nsmanagedobjectcontext,在我的第一个视图控制器中,我要做的是从viewDidLoad中的UIMangedDocument设置NSManagedObjectContext @property(strong, nonatomic) NSManagedObjectContext *managedObjectContext; - (void)viewDidLoad { NSURL *filePath = [[[NSFileManager defaultManager] URLsForDirectory:NSDocu
@property(strong, nonatomic) NSManagedObjectContext *managedObjectContext;
- (void)viewDidLoad
{
NSURL *filePath = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
filePath = [filePath URLByAppendingPathComponent:@"Locations"];
UIManagedDocument *document = [[UIManagedDocument alloc] initWithFileURL:filePath];
//Create if it doesn't exist
if (![[NSFileManager defaultManager] fileExistsAtPath:[filePath path]]) {
//Async save
[document saveToURL:filePath forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
if (success) {
self.managedObjectContext = document.managedObjectContext;
}
}];
} else if (document.documentState == UIDocumentStateClosed){
[document openWithCompletionHandler:^(BOOL success){
//Open it, don't need to refetch stuff
if (success) {
self.managedObjectContext = document.managedObjectContext;
}
}];
} else {
self.managedObjectContext = document.managedObjectContext;
}
}
然后通过category方法在NSMangeObject子类上插入一个新对象
[Location createLocationWithName:@"Maui" inManagedObjectContext:self.managedObjectContext];
这就是所谓的代码
Location *location = [NSEntityDescription insertNewObjectForEntityForName:@"Location" inManagedObjectContext:managedObjectContext];
[managedObjectContext save:nil];
现在我遇到的问题是,当我切换到一个具有公共NSManagedObjectContext属性的新ViewController,并在prepareForSegue中将其设置为此managedObjectContext时,destinationViewController中的NSFetchedResultsController不会立即接受此更改。在我来回导航了几次之后,它最终看到了我在上面创建的毛伊岛的位置。你知道为什么在managedObjectContext中插入一个新对象,然后将其传递给另一个视图控制器并不能反映这种变化吗
非常感谢您的任何见解。如果您的创建方法包含名称,您至少应该设置此属性(否则它将丢失)。因此,您的创作实施的第二行:
location.name = name; // name is passed to the method
为了确保立即更新第二个视图控制器的“获取结果”控制器,您可以在创建FRC时将cacheName
设置为nil
。如果您有很多记录,并且认为需要缓存,可以在视图中执行此操作,该视图将显示:
[self.fetchedResultsController performFetch:&error];
我已经实现了所有这些,但是在转换到另一个视图控制器时,它仍然没有看到我最近插入的内容。请参见上文的“重新加载数据”。如果仍然没有运气,确保你保存了你期望看到的东西。通过sqlite3
命令行工具或Firefox的SQLItemManager检入物理数据库。