2014-06-19 20 views
0

我有三個DataModel在我的應用程序中定義。我的問題是,如果我需要三種不同的背景?所以三個不同的sqlite文件?用於多個dataModels的多ObjectContext?

目前我每次保存記錄到我的數據庫我做到以下幾點:

managedObjectContext = [[AppDelegate sharedAppDelegate] getManagedObjectContextWithDB:@"TestDB.sqlite"]; 

或者如果我保存記錄到我的其他的DataModel我做的:

managedObjectContext = [[AppDelegate sharedAppDelegate] getManagedObjectContextWithDB:@"TestDB2.sqlite"]; 

那麼,那正確的方式?或者我必須只有一個上下文適用於所有三種模式?

這裏有其他的方法:

- (NSManagedObjectContext *)getManagedObjectContextWithDB:(NSString *)db 
{ 
if (_managedObjectContext != nil) { 
    return _managedObjectContext; 
} 
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinatorWithDB:db]; 
if (coordinator != nil) { 
    _managedObjectContext = [[NSManagedObjectContext alloc] init]; 
    [_managedObjectContext setPersistentStoreCoordinator: coordinator]; 
} 

return _managedObjectContext; 
} 

- (NSManagedObjectModel *)managedObjectModel { 
if (_managedObjectModel != nil) { 
    return _managedObjectModel; 
} 
_managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil]; 

return _managedObjectModel; 
} 

- (NSPersistentStoreCoordinator *)persistentStoreCoordinatorWithDB:(NSString *)db { 
if (_persistentStoreCoordinator != nil) { 
    return _persistentStoreCoordinator; 
} 
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] 
              stringByAppendingPathComponent: db]]; 

NSDictionary *options = @{ 
          NSMigratePersistentStoresAutomaticallyOption : @YES, 
          NSInferMappingModelAutomaticallyOption : @YES 
          }; 
NSError *error = nil; 
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] 
           initWithManagedObjectModel:[self managedObjectModel]]; 
if(![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
               configuration:nil URL:storeUrl options:options error:&error]) { 
    /*Error for store creation should be handled in here*/ 
} 

return _persistentStoreCoordinator; 
} 

回答

1

如果數據模型,你的意思是包含實體及其關係(文件擴展名.xcdatamodel)的模型文件,然後我相信答案是肯定的。要與數據模型進行交互,您需要設置持久性存儲協調器並使用模型對其進行實例化(如您所做的那樣)。要與託管對象進行交互,您需要創建一個託管對象上下文(您也已完成)。由於這是不可能的,我假設你只有一個模型文件,而是有3個從這個模型派生的獨立商店。

由於您有興趣建立對應於相同型號的多個商店,因此如果您有一個預先填充的默認數據存儲區,然後是用戶填充存儲區,則完全可能。您只需在協調器上再次撥打addPersistentStoreWithType:configuration:即可。這裏有很多SO的帖子,所以我不會深入。

您需要考慮的一件事是設置多家商店意味着您需要非常小心地觀看您的表現(畢竟您是在移動設備上)。這就是說,你不需要管理三種不同的上下文,你只需要確保商店被添加到你的上下文進行通信的同一個持久存儲協調器中。協調員將完成所有工作,找出要讀取和寫入的存儲區。

我希望這有助於!


編輯

以下IT揭發原來的問題確實圍繞維護單獨的管理對象模型文件,因此獨立的持久存儲協調運轉的意見。 OP實際上存在關於這些實體在上下文中的更新和插入的問題。然後我們意識到這個問題可能是因爲MO在其上下文之外被訪問,因此解決該問題的方法涉及將所有更新包裝到[NSManagedObjectContext performBlock:]方法中的MO中。這爲我們提供了訪問MO的線程安全手段。

謹慎地說,設置三個獨立的模型是一個相當複雜的解決方案,在大多數情況下實際上可能並不需要。擁有不同的模型意味着無法與其他模型中的實體建立任何關係。我對初學者的建議是使用一個模型文件,如果確實有重要的獨立商店,您可以始終使用[NSManagedObjectModel mergedModelFromBundles:]方法創建單獨的商店,同時仍與同一協調員交談。在這一天結束時,Core Data最強大的功能之一就是它的關係管理,並在很多方面設置了單獨的模型限制。

+0

嗨,thx的信息...但目前我有三個* .xcdatamodel文件。我唯一的問題是,如果我還需要三個* .sqlite文件? – davidOhara

+0

假設您想將內容保存到磁盤,那麼是的,只有在使用NSInMemoryStoreType選項時,您不需要後備存儲。對於模型文件,您需要三個持久性存儲協調器,因此需要三個上下文和三個存儲文件,希望這有助於。 –

+0

所以我使用的代碼是正確的? – davidOhara

相關問題