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

Ipad Coredata将sqlite保存到Dropbox-还原问题-在应用程序重新启动之前不会重新加载sqlite文件,ipad,sqlite,core-data,dropbox,dropbox-api,Ipad,Sqlite,Core Data,Dropbox,Dropbox Api,我有一个使用核心数据的iPad应用程序 我正在尝试使用sqlite文件的Dropbox同步,为我的用户提供另一种备份方式 从dropbox备份和恢复没有问题;但是,一旦恢复,必须重置应用程序才能显示数据 我假设这是因为持久性存储仍在使用旧文件 如何强制关闭旧模型并重新打开 我尝试了以下方法,但没有成功: NSPersistentStore* store = [[_persistentStoreCoordinator persistentStores] lastObject]; [_persis

我有一个使用核心数据的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];

最后,我进行了以下操作,重新加载持久存储:

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];

在我的例子中,我发现了一种更简单的方法,即不需要创建新的存储,只需使用现有的存储,但会使核心数据认为内容因为移动而发生了变化:

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

当然,您应该确保在主运行中心锁定时完成此操作。在AICT中,上述操作将隐含地重置MOC,不过您也可以按照您建议的解决方案手动执行。

-(void)restClient:(DBRestClient*)客户端加载的文件:(NSString*)destPath contentType:(NSString*)contentType metadata:(DBMetadata*)元数据{persistentStoreCoordinator=nil;managedObjectContext=nil;managedObjectContext=[self-managedObjectContext];}
试试上面的方法..我也遇到过同样的问题,这对我来说是可行的。。