4

我有一个使用 Core Data 的 iPad 应用程序。

我正在尝试使用 Dropbox 同步 sqlite 文件为我的用户提供另一种备份方式。

从保管箱备份和恢复没有问题;但是,一旦恢复,应用程序必须重新设置才能显示数据

我认为这是因为持久存储仍在使用旧文件。

如何强制关闭旧模型并重新打开?

我试过以下没有运气:

 NSPersistentStore* store = [[_persistentStoreCoordinator persistentStores] lastObject];
[_persistentStoreCoordinator removePersistentStore:store error:nil];
[__managedObjectModel release];
__managedObjectModel = nil;
[_persistentStoreCoordinator release];
_persistentStoreCoordinator = nil;
[self persistentStoreCoordinator];
[self managedObjectContext];
[self managedObjectModel];
4

2 回答 2

2

最后,我使用了以下内容,它重新加载了持久存储:

NSError *error;
// retrieve the store URL
NSURL * storeURL = [[__managedObjectContext persistentStoreCoordinator] URLForPersistentStore:[[[__managedObjectContext persistentStoreCoordinator] persistentStores] lastObject]];
// lock the current context
[__managedObjectContext lock];
[__managedObjectContext reset];//to drop pending changes
//delete the store from the current managedObjectContext
if ([[__managedObjectContext persistentStoreCoordinator] removePersistentStore:[[[__managedObjectContext persistentStoreCoordinator] persistentStores] lastObject] error:&error])
{

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
    [[__managedObjectContext persistentStoreCoordinator] addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error];//recreates the persistent store
}

dispatch_async(dispatch_get_main_queue(), ^{
    self.ready = YES;
    [[NSNotificationCenter defaultCenter]postNotificationName:kModelDidChange object:nil];
});

[__managedObjectContext unlock];
于 2013-01-19T11:25:30.390 回答
0

就我而言,我发现了一些更简单的方法,不需要创建新商店,只需使用现有商店,但会使 Core Data 认为内容已更改,因为它移动了:

NSPersistentStore* store = [[_persistentStoreCoordinator persistentStores] lastObject];
[_persistentStoreCoordinator setURL:store.URL forPersistentStore:store];

您当然应该在 MOC 锁定时完成此操作。AFAICT,上述内容将隐式重置 MOC,尽管您也可以像在您提出的解决方案中那样手动执行此操作。

于 2014-10-13T08:27:02.330 回答