1

3 つの個別の .sqlite データベースに依存するアプリを構築しています。これを可能にするために、App Delegate のどのメソッドを編集する必要がありますか? 今のところ、テンプレートがどのようにそれらを作成したかについては触れていませんmanagedObjectContextmanagedObjectModelpersistantStoreCoordinatorはこのように見えます:

- (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_AConfig_B、およびを追加しました。エンティティをデータベースの構成に移動しました (各エンティティは 1 つのデータベースにのみ存在する必要があります)。Config_CDefault

アプリを実行すると、すべて正常に動作し、問題なくデータを読み書きできます。問題は、テーブルを表示するときに発生します (たとえば、ターミナルまたは Firefox の SQLite Manager を介して)。3つのデータベースすべてにすべてのテーブルが含まれていますが、テーブルには、存在するはずのデータベースにしかデータがありません(他の2つのデータベースのそのテーブルには0行があります)。

すべてのテーブルが各データベースにあるのはなぜですか? 各データベースに必要なテーブルのみを含めるにはどうすればよいですか?

4

2 に答える 2

2

3 つのデータベース (NSPersistentStores) をすべて同じ NSPersistentStoreCoordinator に追加しました。したがって、管理対象オブジェクト コンテキストで保存を実行すると、ストア コーディネーターはそれらの変更をすべてのストアに配布します。代わりに、データベースごとに永続ストア コーディネーターを作成し、おそらくそれらを NSDictionary に保持し、A データベース永続ストア コーディネーターのキー @"A"、B データベース コーディネーターのキー @"B" などを使用します。新しい管理対象オブジェクト コンテキストの場合、それが属するデータベース (NSPersistentStoreCoordinator) を決定する必要があります。これにより、テーブル/変更を分離したままにし、すべてのデータが 3 つのデータベースすべてに入るのを防ぐことができます。

于 2013-11-14T21:27:19.493 に答える