4

以前は、データモデルのバージョン1からバージョン2への自動移行を正常に実装していました。現在、SDK 3.1.3を使用すると、バージョン2からバージョン3への移行が失敗し、次のエラーが発生します。

未解決のエラーエラードメイン=NSCocoaErrorDomainコード=134110UserInfo= 0x5363360 "操作を完了できませんでした。(Cocoaエラー134110。)"、{NSUnderlyingError=エラードメイン=NSCocoaErrorDomainコード=256UserInfo = 0x53622b0 "操作を完了できませんでした。(ココアエラー256.) "; reason="移行の最初のパス後に新しいストアを保存できませんでした。"; }

を使用した自動移行と、のみを使用しNSMigratePersistentStoresAutomaticallyOptionNSInferMappingModelAutomaticallyOption移行を試しNSMigratePersistentStoresAutomaticallyOption、v2からv3へのマッピングモデルを提供しました。

上記のエラーがログに記録され、アプリケーションで使用できるオブジェクトがありません。ただし、アプリケーションを終了して再度開くと、すべてが正常に機能しています。

私が使用しているコアデータの方法は次のとおりです

- (NSManagedObjectModel *)managedObjectModel {

    if (managedObjectModel != nil) {
        return managedObjectModel;
    }



    NSString *path = [[NSBundle mainBundle] pathForResource:@"MYAPP" ofType:@"momd"];
    NSURL *momURL = [NSURL fileURLWithPath:path];
    managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];

    return managedObjectModel;

}
- (NSManagedObjectContext *) managedObjectContext {

    if (managedObjectContext != nil) {
        return managedObjectContext;
    }


    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        managedObjectContext = [[NSManagedObjectContext alloc] init];
        [managedObjectContext setPersistentStoreCoordinator: coordinator];
    }
    return managedObjectContext;
}



- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (persistentStoreCoordinator != nil) {
        return persistentStoreCoordinator;
    }


    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"MYAPP.sqlite"]];


  NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
  [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
  [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

  NSError *error = nil;
  persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
   if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
        // Handle error
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
   }  


return persistentStoreCoordinator;

}

シミュレーターでは、これによりMYAPP〜.sqliteファイルとMYAPP.sqliteファイルが生成されることがわかります。MYAPP〜.sqliteファイルを削除しようとしましたが、

BOOL oldExists = [[NSFileManager defaultManager] fileExistsAtPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"MYAPP~.sqlite"]];

常にNOを返します。どんな手掛かり?私は何か間違ったことをしていますか?前もって感謝します。

4

2 に答える 2

1

私もこれに遭遇し、Apple のドキュメントや Web の投稿をできるだけ多く読んだ後、答えがないように見えました。私の場合、手動の移行も機能していましたが、新しいコーディネーターを開こうとすると、同じエラーが発生しました。私は最終的に、データ モデルの最後の作業バージョンに戻り、一連の小さな変更/バージョンを実行し、自動移行機能がどこで壊れているかを確認して、さらに掘り下げることにしましたが、そうではないことが判明しました。これで、エンティティ、属性、および関係を問題なく追加でき、それらは自動移行されます。データモデルの中間バージョンを削除した可能性はありますか?

于 2010-04-29T23:50:00.863 に答える