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 を 1 つずつ localStore に移動します。

ただし、データベースが大きい場合は、非常に遅くなります。

それで、昨日2番目の解決策を見つけました。


解決策 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 番号も変更する必要があると思います。アプリを次に実行すると、同じストアを 2 回読み込んでいるというエラーが発生します。だから私はこの修正をしました

    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 に答える