Coredata将sqlite保存到Dropbox - 还原问题 - 在应用重新启动之前不会重新加载Sqlite文件

时间:2013-01-18 16:43:08

标签: ipad sqlite core-data dropbox dropbox-api

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

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

从Dropbox备份和恢复不是问题;但是,一旦恢复,必须重置应用程序才能显示数据

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

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

我试过以下但没有运气:

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

2 个答案:

答案 0 :(得分: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];

答案 1 :(得分:0)

在我的情况下,我发现更简单的东西,不需要创建新的商店,只需使用现有商店,但让Core Data认为内容已经改变,因为它已经移动:

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

当然,您应该在MOC锁定时完成此操作。 AFAICT,上述内容将隐含地重置MOC,不过你也可以像你提出的解决方案一样手动完成。