0

CoreDataアプリでオフライン ストレージを管理するために使用しています。NSObjectオフラインストレージのデータは、変形可能としてカスタムに保存されxcdatamodelます。

アプリの現在のバージョン ( v1.0 ) はNavigationクラスを保存しています。

Navigationコードベースの別のターゲットでの名前空間の問題に対処するために、クラスの名前を変更する必要がありました。

CoreDataバージョン 2.0 では、ストアを検索しているときにクラスNSKeyedUnarchiverが見つからないために失敗するため、アプリがクラッシュします。Navigation

CoreDataこの問題に対処するために現在のストアを移行する最善の方法は何ですか?

私はこのようなことを試しました:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"OfflineStorage"];
request.fetchLimit = 1;
request.predicate = [NSPredicate predicateWithFormat:@"storageID = 1"];

NSError *error;
NSArray *result;
@try {
    result = [context executeFetchRequest:request error:&error];
}
@catch (NSException *exception) {
    if([exception.name isEqualToString:NSInvalidUnarchiveOperationException]) {
            NSFetchRequest *deleteRequest = [request copy];
            deleteRequest.resultType = NSManagedObjectIDResultType;
            deleteRequest.includesPropertyValues = NO;
            deleteRequest.propertiesToFetch = @[];

            NSArray *deleteResult = [context executeFetchRequest:request error:&error];
            if(deleteResult.count) {
                [context performBlockAndWait:^{
                    [context deleteObject:deleteResult.firstObject];
                    [context save:nil];
                }];
            }
    }
}

例外をキャッチし、ObjectID のみをフェッチして、ストア内の破損したデータを削除するのは賢明だと思います。しかし、うまくいきません…</p>

4

1 に答える 1

1

その変換可能なクラスの名前も変更した新しいバージョンをモデルに追加しましたか?

独自の移行を行い、変換可能なトランスフォーマーの名前を変更しようとしましたか?

ここにいくつかのドキュメントがあります: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/Introduction.html#//apple_ref/doc/uid/TP40004399-CH1-SW1

私はまだ自分でそれをしていません。今では自動移行で十分だったので。

アップデート

すみません、あなたの質問を誤解しました。

トランスフォーマブルは、独自の値トランスフォーマーによって変換されますか? その場合、 https NSKeyedUnarchiver://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSKeyedUnarchiver_Class/index でこれを使用して、古い名前のクラスを新しいクラスに置き換えることができます。 html#//apple_ref/occ/clm/NSKeyedUnarchiver/setClass:forClassName :

于 2015-07-20T13:11:32.530 に答える