質問

(モデルAのコアデータを使用して作成された)1つのsqliteファイルのコンテンツを、アプリケーション(同じモデルAを使用する)で使用される別のsqliteストアに追加したいと思います。アイデアは、大量のデータをすばやくインポートすることです。

私が直面している問題は、以下のコードが一度しか動作しないことです。同じコードを2回実行しようとすると、コメントでマークした行でアプリケーションがクラッシュします。どんな助けも大歓迎です。

NSError **err;
NSURL *importURL = [NSURL fileURLWithPath:[[[NSBundle mainBundle] resourcePath]  stringByAppendingPathComponent: @"import.sqlite"]];
NSURL *storeURL = [NSURL fileURLWithPath:[[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"applicationdata.sqlite"]];
NSMigrationManager *migrator = [[NSMigrationManager alloc] initWithSourceModel:[self managedObjectModel] destinationModel:[self managedObjectModel]];
NSMappingModel *mappingModel = [NSMappingModel inferredMappingModelForSourceModel:[self managedObjectModel] destinationModel:[self managedObjectModel] error:err];
NSError **err2;

// the following line crashes when the whole block is ran twice
[migrator migrateStoreFromURL:importURL 
                         type:NSSQLiteStoreType 
                      options:nil 
             withMappingModel:mappingModel 
             toDestinationURL:storeURL 
              destinationType:NSSQLiteStoreType 
           destinationOptions:nil 
                        error:err2];

NSLog(@"import finished");
[migrator release];
役に立ちましたか?

解決

そのコードに1つの間違いがあります。これは、そのメソッド呼び出しのエラー引数に関係しています。 NS発生します)。現時点では、その時点でスタックに何が起こっているかに応じて、有効な何かを指すか、または完全なガベージを指すことができる初期化されていないポインターを渡すだけです。 migratorのメソッドはこの時点まで書き込みます。時には明らかな悪影響はありませんが、時々見ているようにクラッシュを引き起こします。そのためのコードは次のようになります。

NSError *err2 = nil; //you want to initialize to nil, in case method doesn't modify your pointer at all (i.e. no error occurs)

//the method also returns a BOOL indicating success/failure
if (![migrator migrateStoreFromURL:importURL 
                     type:NSSQLiteStoreType 
                  options:nil 
         withMappingModel:mappingModel 
         toDestinationURL:storeURL 
          destinationType:NSSQLiteStoreType 
       destinationOptions:nil 
                    error:&err2])
{
    //handle the error
}

他のヒント

これを指摘してくれたブライアンに感謝します。

追加のsqliteファイルをスタックの永続ストアに追加するだけで、非常にうまく機能し、後でfetchRequestを個々のストアに制限できます:

NSError *error = nil;
NSURL *url = SOME_FILEPATH_URL;
NSPersistentStore *newStore = [persistentStoreCoordinator 
                                    addPersistentStoreWithType:NSSQLiteStoreType
                                                 configuration:nil
                                                           URL:url 
                                                       options:opt
                                                         error:&error];

そして、後で参照できるように、すべてのpersistentStoreの辞書を保持しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top