1

iCloud在我的应用程序中有。我已从iCloud我的应用程序中删除,但在 ios 6 应用程序崩溃并且我收到以下消息:

  -[NSPersistentStoreCoordinator addPersistentStoreWithType:configuration:URL:options:error:](1055): 

CoreData: Ubiquity: Error:以前使用 iCloud 集成选项添加到协调器的持久性存储必须始终使用选项字典中存在的选项添加到协调器。如果您希望在没有 的情况下使用存储iCloud,请将数据从iCloud存储文件迁移到本地存储中的新存储文件。

我该如何解决这个错误?如何将数据从iCloud存储文件迁移到本地存储中的新存储文件?

4

2 回答 2

4

是的,我也有这个问题。我想把 iCloud 商店变成本地商店


解决方案 1:将 managedObjects 一个一个移动到 localStore。

但是如果你有一个大数据库,它会很慢。

所以我昨天找到了第二个解决方案。


解决方案 2:编辑 iCloud 商店的元数据,

并将其保存到新位置。

删除元数据中的“com.apple.coredata.ubiquity.*”键后,您将获得一个完全本地的存储。


这是我的解决方案 2 的代码:

已经设置了一些属性:

@property (nonatomic, strong) NSPersistentStoreCoordinator *coordinator;
@property (nonatomic, strong) NSManagedObjectContext *context;

@property (nonatomic, strong) NSPersistentStore *iCloudStore;
//represent the iCloud store already using 
//(after [coordinator addPersistentStore] you get this NSPersistentStore)

@property (nonatomic, strong) NSURL *iCloudStoreURL;
//represent the iCloud store real location
//(it is the URL you send to the [coordinator addPersistentStore])

@property (nonatomic, strong) NSURL *iCloudStoreLocalVersionURL;
//represent the location of local version store you want to save

以及迁移方法:

-(void)migrateCloudStoreToLocalVersion
{
    if(!self.iCloudStore)
        return;

    // remove previous local version
    [FILE_MANAGER removeItemAtURL:self.iCloudStoreLocalVersionURL
                            error:nil];

    // made a copy from original location to the new location
    [FILE_MANAGER copyItemAtURL:self.iCloudStoreURL
                          toURL:self.iCloudStoreLocalVersionURL
                          error:nil];

    //prepare meta data
    NSDictionary *iCloudMetadata = [self.coordinator metadataForPersistentStore:self.iCloudStore].copy;

    NSMutableDictionary *localVersionMetadata = iCloudMetadata.mutableCopy;
    for(NSString * key in iCloudMetadata){
        if([key hasPrefix:@"com.apple.coredata.ubiquity"]){
            [localVersionMetadata removeObjectForKey:key];
        }
    }

    //modify iCloud store
    [self.coordinator setMetadata:localVersionMetadata forPersistentStore:self.iCloudStore];
    [self.coordinator setURL:self.iCloudStoreLocalVersionURL forPersistentStore:self.iCloudStore];

    //save to the localVersion location
    [self.context save:nil];

    //restore iCloud store
    [self.coordinator setMetadata:iCloudMetadata forPersistentStore:self.iCloudStore];
    [self.coordinator setURL:self.iCloudStoreURL forPersistentStore:self.iCloudStore];
}

然后您可以使用iCloudStoreLocalVersionURL本地版本存储。

您可以将此本地版本存储用作本地存储,而不会出现任何错误。

笔记:

注意NSStoreUUIDKey元数据中的

您可以选择将其替换为新商店。

于 2012-12-27T06:40:01.917 回答
0

我相信您也必须更改 UUID 编号,我会在应用程序的下一次运行时收到错误,即它两次加载同一个商店。所以我做了这个修改

    if (!self.iCloudStore) return;
NSError *error = nil;

NSURL* localStoreURL = [self fallbackStoreURL];

 NSFileManager *fm = [[NSFileManager alloc] init];

 if (!self.fallbackStore) [self loadFallbackStore:&error];

NSString* fallBackUUID;

//find UUID of original to put back in later
NSDictionary *fallBackMetadata = [_psc metadataForPersistentStore:self.fallbackStore].copy;
for(NSString* key in fallBackMetadata)
{
    if([key hasPrefix:@"NSStoreUUID"])
    {
        fallBackUUID = [fallBackMetadata objectForKey:key];
        break;
    }
}

[fm removeItemAtURL:localStoreURL error:nil];


//prepare meta data
NSDictionary *iCloudMetadata = [_psc metadataForPersistentStore:self.iCloudStore].copy;
NSMutableDictionary *localVersionMetadata = iCloudMetadata.mutableCopy;
for(NSString* key in iCloudMetadata)
{
    if([key hasPrefix:@"com.apple.coredata.ubiquity"])
    {
        [localVersionMetadata removeObjectForKey:key];
    }

    if([key hasPrefix:@"NSStoreUUID"])
    {
         if (fallBackUUID) [localVersionMetadata setObject:fallBackUUID forKey:key];
    }
}


//modify iCloud store
[_psc setMetadata:localVersionMetadata forPersistentStore:self.iCloudStore];
[_psc setURL:localStoreURL forPersistentStore:self.iCloudStore];

// make a copy from original location to the new location
[fm copyItemAtURL:[self iCloudStoreURL]
                      toURL:localStoreURL
                      error:nil];

 [_fallbackContext save:nil];


[_psc setMetadata:iCloudMetadata forPersistentStore:self.iCloudStore];
[_psc setURL:[self iCloudStoreURL] forPersistentStore:self.iCloudStore];
于 2013-03-13T02:04:29.970 回答