9

現在、 Core Data iCloud 移行に苦労しています。

.nosyncストアを iCloud ユビキタス コンテナー ( ) からローカル URLに移動したいと考えています。問題は、次のようなものを呼び出すたびに次のようになることです。

[self.persistentStoreCoordinator migratePersistentStore: currentiCloudStore 
                                                  toURL: localURL 
                                                options: nil 
                                               withType: NSSQLiteStoreType 
                                                  error: &error];

次のエラーが表示されます。

-[NSPersistentStoreCoordinator addPersistentStoreWithType:configuration:URL:options:error:](1055): CoreData: Ubiquity:  Error: A persistent store which has been previously added to a coordinator using the iCloud integration options must always be added to the coordinator with the options present in the options dictionary. If you wish to use the store without iCloud, migrate the data from the iCloud store file to a new store file in local storage. file://localhost/Users/sch/Library/Containers/bla/Data/Documents/tmp.sqlite. This will be a fatal error in a future release

誰もこれを見たことがありますか?たぶん、適切な移行オプションが不足しているだけですか?

4

4 に答える 4

2

私の推測では、エラー メッセージに基づいて、オプションを nil に設定すると、PSC はストアを移動できなくなります。おそらく、元のストアのオプションのディクショナリを取得し、それらを nil に設定する代わりに渡す必要があります。

于 2012-11-24T21:00:44.360 に答える
2

はい、私もこの質問があります。

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データの

必要に応じて、新しいストアに置き換えることができます。

マイクに:

問題は:

iCloudストアを追加する際に完全なiCloudオプションを使用すると、すべてが正しくなりますが、iCloudストアのままです. ここでは、iCloud ストアをローカル ストアに変更します。

iCloud オプション以外のオプションを追加すると、エラーが発生し、このストアに変更を保存できません。

したがって、あなたの答えはこの問題に対するものではありません。

于 2012-12-27T05:56:53.043 に答える
1

iOS 7 の時点で、iCloud ユビキタスをドロップしながらストアを移行するための、より簡単で論理的な方法がありNSPersistentStoreRemoveUbiquitousMetadataOptionます。オプションを渡すだけです。

NSDictionary *options = [NSDictionary dictionaryWithObject:@YES
                                                    forKey:NSPersistentStoreRemoveUbiquitousMetadataOption];
[self.persistentStoreCoordinator migratePersistentStore: currentiCloudStore 
                                              toURL: localURL 
                                            options: nil 
                                           withType: NSSQLiteStoreType 
                                              error: &error];

これにより、ストアがローカル URL に移行され、基本的に @frogcjn が手動で行ったすべての iCloud メタデータが削除されます。

于 2016-01-05T20:40:15.057 に答える