3 つの個別の .sqlite データベースに依存するアプリを構築しています。これを可能にするために、App Delegate のどのメソッドを編集する必要がありますか? 今のところ、テンプレートがどのようにそれらを作成したかについては触れていませんmanagedObjectContext
。managedObjectModel
私persistantStoreCoordinator
はこのように見えます:
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (_persistentStoreCoordinator != nil)
{
return _persistentStoreCoordinator;
}
NSURL *storeURLConfigA = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"dbA.sqlite"];
NSURL *storeURLConfigB = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"dbB.sqlite"];
NSURL *storeURLConfigC = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"dbC.sqlite"];
// // Pre-load .sqlite db in Project Navigator into app on first run after deleting app
if (![[NSFileManager defaultManager] fileExistsAtPath:[storeURLConfigA path]])
// dbA
{
NSURL *preloadURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"dbA" ofType:@"sqlite"]];
NSError* err = nil;
if (![[NSFileManager defaultManager] copyItemAtURL:preloadURL toURL:storeURLConfigA error:&err])
{
NSLog(@"Error preloading database A - %@",error.description);
}
}
if (![[NSFileManager defaultManager] fileExistsAtPath:[storeURLConfigB path]])
// dbB
{
NSURL *preloadURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"dbB" ofType:@"sqlite"]];
NSError* err = nil;
if (![[NSFileManager defaultManager] copyItemAtURL:preloadURL toURL:storeURLConfigB error:&err])
{
NSLog(@"Error preloading database B - %@",error.description);
}
}
if (![[NSFileManager defaultManager] fileExistsAtPath:[storeURLConfigC path]])
// dbC
{
NSURL *preloadURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"dbC" ofType:@"sqlite"]];
NSError* err = nil;
if (![[NSFileManager defaultManager] copyItemAtURL:preloadURL toURL:storeURLConfigC error:&err])
{
NSLog(@"Error preloading database C - %@",error.description);
}
}
// // Put the Configs into the PersistantStoreCoordinator and tie them to their database file
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSDictionary *options = @{NSSQLitePragmasOption : @{@"journal_mode": @"DELETE"}};
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:@"Config_A" URL:storeURLConfigA options:options error:&error])
{
NSLog(@"Error setting up dbA - %@",error.description);
abort();
}
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:@"Config_B" URL:storeURLConfigB options:options error:&error])
{
NSLog(@"Error setting up dbB - %@",error.description);
abort();
}
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:@"Config_C" URL:storeURLConfigC options:options error:&error])
{
NSLog(@"Error setting up dbC - %@",error.description);
abort();
}
return _persistentStoreCoordinator;
}
mainBundle
次に、 3 つのデータベースすべてに対して、すべてのテーブル/エンティティを含む .xcdatamodelID を 1 つ持っています。XCode の CoreData エディター インターフェイスを使用して、Configurationに加えて、 Configurations Config_A
、Config_B
、およびを追加しました。エンティティをデータベースの構成に移動しました (各エンティティは 1 つのデータベースにのみ存在する必要があります)。Config_C
Default
アプリを実行すると、すべて正常に動作し、問題なくデータを読み書きできます。問題は、テーブルを表示するときに発生します (たとえば、ターミナルまたは Firefox の SQLite Manager を介して)。3つのデータベースすべてにすべてのテーブルが含まれていますが、テーブルには、存在するはずのデータベースにしかデータがありません(他の2つのデータベースのそのテーブルには0行があります)。
すべてのテーブルが各データベースにあるのはなぜですか? 各データベースに必要なテーブルのみを含めるにはどうすればよいですか?