核心数据持久性存储迁移时出错

时间:2014-05-20 12:20:00

标签: ios objective-c core-data migration icloud

我在启用CoreData的应用程序中尝试使用iCloud Sync。到目前为止一切正常但现在我想在设置和切换中添加iCloud On / Off Toggle将我的持久存储从iCloud迁移到Local,反之亦然,这样用户就不会丢失他的数据。

当我第一次设置CoreData Persistent时,我询问用户是否要使用iCloud,如果他回答是,我使用以下设置persistentStore

[self.managedObjectContext.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                                                       configuration:nil
                                                                                 URL:self.storeURL
                                                                             options:@{ NSPersistentStoreUbiquitousContentNameKey : @"iCloudStore" }
                                                                               error:&error];

如果他回答否我将只传递nil作为选项参数。

当用户切换迁移时(在此示例中,从iCloud到本地),我执行迁移,如下所示:

//Migrate
__weak NSPersistentStoreCoordinator *psc = self.managedObjectContext.persistentStoreCoordinator;
NSError *error;
NSPersistentStore *currentStore = [[psc persistentStores] firstObject];
[psc migratePersistentStore:currentStore <------------------ this fails
                      toURL:self.storeURL
                    options:@{ NSPersistentStoreRemoveUbiquitousMetadataOption : @YES }
                   withType:NSSQLiteStoreType
                      error:&error];
if(error){
    NSLog(@"migrateType:%@ migrateError:%@ userInfo:%@",migrateType,migrateError,[migrateError userInfo]);
    return;
}
self.useCloud = NO;
//Reloading the Store afterwards....

根据&#34; This&#34;和&#34; This&#34;。 我应该可以使用相同的&#34; storeURL&#34;对于云和本地存储,但不幸的是迁移失败并出现错误:

migrateType:toLocal migrateError:Error Domain=NSCocoaErrorDomain Code=134080 "The operation couldn’t be completed. (Cocoa error 134080.)" UserInfo=0x12a1f0a0 {NSUnderlyingException=Can't add the same store twice} userInfo:{
NSUnderlyingException = "Can't add the same store twice";

我知道我应该能够使用不同的本地和云URL来解决这个问题,但是因为这会使事情变得复杂,所以我宁愿一直使用相同的URL。

任何想法如何解决这个问题?

先谢谢

P.S .: 商店网址方式:

- (NSURL*)storeURL{
NSURL* documentsDirectory = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:NULL];
return [documentsDirectory URLByAppendingPathComponent:@"nameIsNotImportant.sqlite"];
}

ps.s.s:其iOS7

0 个答案:

没有答案