如何在持久性存储上创建两个持久性存储协调器

时间:2016-05-13 13:50:27

标签: core-data

我想用一个持久存储创建两个持久存储协调器。enter image description here

但我无法添加商店添加一个协调员以添加到另一个协调员

- (void) initializeCoreData {
    if ([self managedObjectContext]) return;
    NSURL *modelUrl = [[NSBundle mainBundle] URLForResource:@"MyModel" withExtension:@"momd"];
    NSManagedObjectModel *mom = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelUrl];
    NSAssert(mom, @"%@:%@ No model to generate a store from", [self class], NSStringFromSelector(_cmd));
    NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
    NSPersistentStoreCoordinator *batchPersistentCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
    NSAssert(coordinator, @"Failed to initialize coordinator");
    [self setManagedObjectContext:[[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]];
    [self setBatchUpdateManagedObjectContext:[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]];
    [self setPrivateContext:[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]];
    [[self batchUpdateManagedObjectContext] setPersistentStoreCoordinator:batchPersistentCoordinator];
    [[self privateContext] setPersistentStoreCoordinator:coordinator];
    [[self managedObjectContext] setParentContext:[self privateContext]];

    dispatch_queue_t queue = NULL;
    queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
        NSPersistentStoreCoordinator *psc = [[self privateContext] persistentStoreCoordinator];
        NSMutableDictionary *options = [NSMutableDictionary dictionary];
        options[NSMigratePersistentStoresAutomaticallyOption] = @(YES);
        options[NSInferMappingModelAutomaticallyOption] = @(YES);
        options[NSSQLitePragmasOption] = @{@"journal_mode":@"DELETE"};
        NSFileManager *fileManager = [NSFileManager defaultManager];
        NSArray *directoryArray = [fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];
        NSURL *storeUrl = nil;
        storeUrl = [directoryArray lastObject];
        storeUrl = [storeUrl URLByAppendingPathComponent:@"MyModel.sqlite"];
        NSError *error = nil;
        NSPersistentStore *store = nil;
        store = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error];
        NSAssert(store, @"Error initializing PSC: %@\n%@", [error localizedDescription], [error userInfo]);

        psc = [[self batchUpdateManagedObjectContext] persistentStoreCoordinator]
        store = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error];
        NSAssert(store, @"Error initializing PSC: %@\n%@", [error localizedDescription], [error userInfo]);

        if (![self initCallBack]) return;

        dispatch_sync(dispatch_get_main_queue(), ^{
            [self initCallBack]();
        });
    });
}

1 个答案:

答案 0 :(得分:1)

只要您使用基于SQLite的商店,绝对没有什么可以阻止您做到这一点。正如汤姆所问,你尝试时发生了什么?

也许展示你的创作代码?

您的代码已接近完成,您只缺少一步:

dispatch_async(queue, ^{
    NSPersistentStoreCoordinator *psc = [[self privateContext] persistentStoreCoordinator];
    NSMutableDictionary *options = [NSMutableDictionary dictionary];
    options[NSMigratePersistentStoresAutomaticallyOption] = @(YES);
    options[NSInferMappingModelAutomaticallyOption] = @(YES);
    options[NSSQLitePragmasOption] = @{@"journal_mode":@"DELETE"};
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSArray *directoryArray = [fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];
    NSURL *storeUrl = nil;
    storeUrl = [directoryArray lastObject];
    storeUrl = [storeUrl URLByAppendingPathComponent:@"MyModel.sqlite"];
    NSError *error = nil;
    NSPersistentStore *store = nil;
    store = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error];
    NSAssert(store, @"Error initializing PSC: %@\n%@", [error localizedDescription], [error userInfo]);

    psc = [[self batchUpdateManagedObjectContext] persistentStoreCoordinator]
    store = [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error];
    NSAssert(store, @"Error initializing PSC: %@\n%@", [error localizedDescription], [error userInfo]);

    if (![self initCallBack]) return;

    dispatch_sync(dispatch_get_main_queue(), ^{
        [self initCallBack]();
    });
});

只需获取对第二个NSPersistentStoreCoordinator的引用,然后同时调用addPersistentStoreWithType configuration: URL: error:。您甚至可以使用完全相同的参数。