2017-08-04 9 views
0

私は数年前にコアデータを使用するアプリケーションの更新作業中です。以前のバージョンでは、そのデータはDocuments/app-name.sqliteに保存されていました。アップデートのデータ関連コードは変更していませんが、初めて新しいバージョンを起動すると、はライブラリ/アプリケーションサポート/ app-name.sqliteに新しい空のデータストアを作成します。これを解決する方法はわかりません。コアアプリケーションは、アプリケーションを更新するときに余分な空のストアを作成します。

初期のコアデータの設定は、次のようになります思える

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:SKCoreDataModelName withExtension:@"momd"]; 
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 


    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:[SKCoreDataModelName stringByAppendingString:@".sqlite"]]; 
    NSError *error = nil; 
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 

    NSDictionary *opts = [NSDictionary dictionaryWithObjectsAndKeys: 
          [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
          [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, 
          nil]; 
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:opts error:&error]) { 
     SKLogError(@"Unresolved error when creating persistent store coordinator %@, %@", error, [error userInfo]); 
    } 

は、新しいバージョンで正常に動作する:エラーは、作成した新しいデータベースをトリガしません。このによるステッピング

 _persistentContainer = [[NSPersistentContainer alloc] initWithName:SKCoreDataModelName]; 
     [_persistentContainer loadPersistentStoresWithCompletionHandler:^(NSPersistentStoreDescription *storeDescription, NSError *error) { ... }]; 

、私はNSPersistentContainerを初期化する際に、Library/Application Supportフォルダは、シミュレータのデータに表示されていることを見ることができます;:問題は、私は永続的なコンテナをインスタンス化する際に生じますloadPersistentStoresWithCompletionHandlerと呼ぶと、新しいsqliteファイルが表示されます。

ここでは何が起こっているのですか、もっと重要なことはどうしたらいいですか?ありがとう。

答えて

1

新しいNSPersistentContainerクラスには、物を作成する場所/方法にいくつかの規則があります。デフォルトでは、{name}を渡すと "{name} .momd"というモデルファイルが検索され、 "{name} .sqlite"という名前の "Application Support"にsqliteファイルが作成されます。これらのデフォルトはオーバーライドできます。あなたのコンテナを作成した後

が、負荷を呼び出す前に、あなたはこれを行う必要があります。

スウィフト:

let description = NSPersistentStoreDescription(url: storeURL); 
_persistentContainer.persistentStoreDescriptions = [description]; 

のObj-C:

NSPersistentStoreDescription *_description = [NSPersistentStoreDescription persistentStoreDescriptionWithURL:storeUrl: storeUrl]; 
_persistentContainer.persistentStoreDescriptions = @[description]; 

これはにデフォルトのURLをリセットします店舗で使用します。

+0

これだけです!どうもありがとうございます! (実際にはストアの説明をインスタンス化するための呼び出しは、実際には[NSPersistentStoreDescription persistentStoreDescriptionWithURL:storeUrl]です) 私はむしろデフォルトに移行したいと思います。正直なところ、既存のストアを移行するにはアプリケーションサポートの標準の場所に移動しますか? –

+0

自動的に実行する方法があるかどうかわかりませんが、NSFileManagerを使用して手動で移動する方法があります。 –

関連する問題