私のアプリは2つのデータベースが含まれます。コアデータ:店を開くために使用されるモデルは、ストアを作成するために使用したものと互換性がありません
- DB1:読み取り/書き込みデータベース(すべてのユーザー設定を保存する)を
- DB2:読み取り専用データベース、別のプロジェクトにプリロード(Iプロジェクトで.sqlite、.xcdatamodeldおよびエンティティクラスをコピー)
iが2 MOC及び2 PSCとコアデータを初期化する場合(各データベースに対して1つの):すべて正常に動作します。しかし、私は2つのデータベースのための1つのMOC/PSCを初期化したいと思います。これを行うために、私は次のコードを書いた:
- (NSManagedObjectContext *)managedObjectContext
{
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return _managedObjectContext;
}
- (NSManagedObjectModel *)managedObjectModel
{
if (_managedObjectModel != nil) {
return _managedObjectModel;
}
NSURL *db1ModelURL = [[NSBundle mainBundle] URLForResource:@"db1" withExtension:@"momd"];
NSManagedObjectModel *db1Mom = [[NSManagedObjectModel alloc] initWithContentsOfURL:db1ModelURL];
NSURL *db2ModelURL = [[NSBundle mainBundle] URLForResource:@"db2" withExtension:@"momd"];
NSManagedObjectModel *db2Mom = [[NSManagedObjectModel alloc] initWithContentsOfURL:db2ModelURL];
NSAssert(db1 != nil, @"Error initializing Managed Object Model");
NSAssert(db2 != nil, @"Error initializing Managed Object Model");
_managedObjectModel=[NSManagedObjectModel modelByMergingModels:[NSArray db1Mom,db2Mom, nil]];
return _managedObjectModel;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
NSURL * db1URL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"db1.sqlite"];
NSURL *db2URL = [[NSBundle mainBundle] URLForResource:@"db2" withExtension:@"sqlite"];
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
_persistentStoreCoordinator = [[self managedObjectContext] persistentStoreCoordinator];
NSMutableDictionary * db2Options=[NSMutableDictionary dictionaryWithObjectsAndKeys:
@YES,NSReadOnlyPersistentStoreOption,
nil];
NSPersistentStore *store = [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:@"DB2" URL:db2URL options:db2Options error:&error];
NSAssert(store != nil, @"Error initializing PSC: %@\n%@", [error localizedDescription], [error userInfo]);
NSMutableDictionary * db1Options=[NSMutableDictionary dictionaryWithObjectsAndKeys:
@YES,NSMigratePersistentStoresAutomaticallyOption,
@YES,NSInferMappingModelAutomaticallyOption,
nil];
store = [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:@"DB1" URL:db1URL options:db1Options error:&error];
NSAssert(store != nil, @"Error initializing PSC: %@\n%@", [error localizedDescription], [error userInfo]);
return _persistentStoreCoordinator;
}
を、私はアプリを起動したときに、私は、DB2データベースに次のエラーを取得:
The model used to open the store is incompatible with the one used to create the store
私は問題がへの呼び出しが付属して考えますmodelByMergingModels、結果のモデルにはdb2Modelが含まれていますが、コア・データはそれをこのデータベースのベース・モデルとして認識しません。
提案はありますか?
アプリを一度削除してインストールしてみてください。 – vaibhav
コアデータに変更を加えたら、アプリを削除してから再インストールする必要があります。 – Starlord
@Joakim私はすでにアプリを削除/インストールしようとしましたが動作しません。私はこのエラーが新しくインストールされた後に発生しています... –