4

.xcdatamodeld の変更による影響を受けないように、persistentStore を再作成 (ドロップ & 作成) したいと思います。

私は AppDelegate で以下のようなコードpersistentStoreCoordinatorを書きました:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }

    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"myproject.sqlite"];

    // delete if database exists
    NSError *error = nil;
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {

        // if .xcdatamodeld is changed, fail and in here...
        // if not changed, recreate success. all data removed from database

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
    NSArray *stores = [_persistentStoreCoordinator persistentStores];
    for (NSPersistentStore *store in stores) {
        [_persistentStoreCoordinator removePersistentStore:store error:nil];
        [[NSFileManager defaultManager] removeItemAtPath:store.URL.path error:nil];
    }

    // newly create database
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return _persistentStoreCoordinator;
}

.xcdatamodeld(エンティティに新しい列を追加するなど)変更を加えてシミュレーターを再起動すると、最初は失敗しaddPersistentStoreWithType、ログに次のように表示されます

Unresolved error Error Domain=NSCocoaErrorDomain Code=134100 
The operation couldn’t be completed. (Cocoa error 134100.)

どうやってやるの?

4

2 に答える 2

1

次のコードは私にとってうまくいくようです。

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }

    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"myproject.sqlite"];

    // delete database if exists
    [[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:nil];

    // create database
    NSError *error = nil;
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return _persistentStoreCoordinator;
}

以下を確認しました(デバイスとシミュレーターで):

  1. 最初の起動時に、データベースを作成する必要があります
  2. .xcdatamodeld を編集 (列またはエンティティを追加/編集/削除) してから再起動し、データベースを再作成する必要があります

アドバイスありがとうございます。

于 2013-12-02T16:51:51.547 に答える
1

問題を解決する最も簡単な方法は、このエラーを次の方法で処理することです: DB ファイルを削除して、もう一度やり直してください。試用期間でも構いません。

ただし、安定したソリューションが必要な場合は、モデルとバージョンおよび自動移行を使用してください。

[persistentStoreCoordinator addPersistentStoreWithType: NSSQLiteStoreType
                                         configuration: nil
                                                   URL: storeURL
                                               options: @{NSMigratePersistentStoresAutomaticallyOption : @(YES),
                                                       NSInferMappingModelAutomaticallyOption       : @(YES)}
                                                 error: &error];

また、自動移行では不十分な場合は、移行マッピングを提供する必要があります。

ストアを削除するだけの場合は、次のようにファイル マネージャーを使用します。

[[NSFileManager defaultManager] removeItemAtURL: storeURL
                                          error: &error];
于 2013-12-02T09:20:10.830 に答える