1

ユーザーが新しいバージョンの iOS アプリにアップグレードまたは再インストールしたときに呼び出されるデリゲート メソッドはありますか?

Core Data を使用して、サーバーからの情報をキャッシュします。エンティティのスキーマが変更された場合、SQLite データベースをシミュレーターから手動で削除する必要があります。そうしないと、起動時にアプリがクラッシュし、「ストアを開くために使用されるモデルは、ストアの作成に使用されるモデルと互換性がありません」というエラーが表示されます。 ." アプリのアップグレードに委任方法がある場合は、削除を自動化できます。

4

3 に答える 3

4

CoreData のバージョン管理を使用する必要があります。

http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/CoreDataVersioning/Articles/Introduction.html

于 2012-10-12T17:52:16.917 に答える
2

Daniel Smithの答えは適切ですが、アプリが更新されたと判断する方法を追加したいと思います。「現在のバージョン」の文字列をデフォルトのままにしておくようです。アプリが起動したら、現在のバージョンと比較します。

  • デフォルトには文字列がありません-これはアプリの最初の実行です
  • デフォルトのバージョンが異なります-ユーザーがアプリを更新しました
  • デフォルトは同じです-ユーザーはアプリを再起動したばかりです

上記を知っておくといい場合があります。タグを設定した直後にデフォルトを保存し、必要なバージョン管理を行うようにしてください。そうすれば、クラッシュによって再度実行する必要がなくなります。

編集:彼がモデルを変更した場合にクラッシュしない方法。私は今これを使用し、古いリポジトリを保持し、モデルを微調整します。微調整するたびに、古いリポジトリを削除して(開くことができない場合)、新しいリポジトリを作成します。これはAppleのコードをモデルにしていますが、私がどのような変更を加えたかはわかりません。いずれの場合も、モデルが変更されてもクラッシュすることはありません。

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{   
    //LTLog(@"_persistentStoreCoordinator = %@", _persistentStoreCoordinator); 
    if (_persistentStoreCoordinator)
    {
        return _persistentStoreCoordinator;
    }
    NSFileManager *manager = [NSFileManager defaultManager];
    NSString *path = [[appDelegate applicationAppSupportDirectory] stringByAppendingPathComponent:[_dbName stringByAppendingPathExtension:@"SQLite"]];
    storeURL = [NSURL fileURLWithPath:path];

    BOOL fileExists = [manager fileExistsAtPath:path];
    if(!fileExists) {
        _didCreateNewRepository = YES;
    }
    if(_createNewRepository) {
        [manager removeItemAtURL:storeURL error:nil];
        if(fileExists) _didDestroyOldRepository = YES;
        _didCreateNewRepository = YES;
    }

    while(YES) {
        __autoreleasing NSError *error = nil;
        _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
        if ([_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {

            break;
        } else {
            _persistentStoreCoordinator = nil;
            [manager removeItemAtURL:storeURL error:&error];
            if(fileExists) {
                _didDestroyOldRepository = YES; // caller didn't want a new one but got a new one anyway (old one corrupt???)
                _didCreateNewRepository = YES;
            }
#ifndef NDEBUG
            LTLog(@"CORE DATA failed to open store %@: error=%@", _dbName, error);
#endif
            /*
             Replace this implementation with code to handle the error appropriately.

             abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button.

             Typical reasons for an error here include:
             * The persistent store is not accessible
             * The schema for the persistent store is incompatible with current managed object model
             Check the error message to determine what the actual problem was.
             */
            //LTLog(@"Unresolved error %@, %@", error, [error userInfo]);
            //abort();
        }    
    }
    return _persistentStoreCoordinator;
}
于 2012-10-12T18:02:25.553 に答える
1

ブログをフォローしてください。

http://blog.10to1.be/cocoa/2011/11/28/core-data-versioning/

于 2012-10-12T18:09:08.093 に答える