2016-05-13 241 views
0

我想用一個持久存儲創建兩個持久存儲協調器。 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](); 
     }); 
    }); 
} 
+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:爲好。你甚至可以使用完全相同的參數。

+0

我對你的核心數據書很感興趣。它對我學習新類型的堆棧非常有幫助。如果你看到我的代碼,我創建了兩個持久存儲協調器,即協調器和batchPersistentCoordinator。我已將privateContext的persistentStoreCoordinator設置爲coordinator,將batchUpdateManagedObjectContext設置爲batchPersistentCoordinator。現在我無法添加相同的sqlite商店作爲addPersistentStoreWithType:方法返回store.What應該是代碼的新實例? – harpreetSingh