2012-05-09 33 views
1

我試圖讓NSPersistentStoreCoordinator管理多個持久性存儲的刪除和插入。到目前爲止,我已經成功配置了兩個商店的PSC,並且通過指定其索引,我能夠刪除任何商店。使用PersistentStoreCoodinator管理多個NSPersistentStore

就像這個...

NSPersistentStore *store = [[self.persistentStoreCoordinator persistentStores] objectAtIndex:0]; 

     if (![self.persistentStoreCoordinator removePersistentStore:store error:&error]) { 

      NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 

      abort(); 

     } 

     [[NSFileManager defaultManager] removeItemAtURL:store.URL error:&error]; 

但我發現,當我添加了存回的PSC的索引值是不正確的,它不能與現有的類方法來指定。這樣做的結果是新數據被下載並添加到錯誤的商店。

有沒有人有任何建議如何做到這一點?

背景(更新)

之所以使用兩個持久性存儲是這樣我可以指定唯一的商店,將通過網絡下載的兩個XML文檔。由於這兩個文件都比較大,我希望減少網絡流量。因此,檢查是否已被修改。如果他們有,那麼相應的永久存儲被刪除並添加一個新的存儲。在這一點上,問題就開始了。添加一個新商店總是將其添加到永久存儲陣列的末尾。將數據合併到MOC時,這似乎會在商店中造成不匹配。

代碼 這裏是我到目前爲止從而消除嘗試,並增加了持久存儲,但新數據添加到錯誤的商店。

static NSString * const kLastDateStoreUpdateKey = @"eventLastStoreUpdateKey"; 

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 

NSString *last_modified = [NSString stringWithFormat:@"%@",[[(NSHTTPURLResponse *)response allHeaderFields] objectForKey:@"Last-Modified"]]; 

NSDateFormatter *dFormatter = [[NSDateFormatter alloc] init]; 
[dFormatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss zzz"]; 
[dFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"]]; 
[dFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT"]]; 

dateModified = [dFormatter dateFromString:last_modified]; 
NSDate *previousDate = [[NSUserDefaults standardUserDefaults] objectForKey:kLastDateStoreUpdateKey]; 

if (!previousDate || [previousDate compare:dateModified] != NSOrderedSame) { 

    [self.managedObjectContext lock]; 
    [self.managedObjectContext reset]; 


    if ([[NSFileManager defaultManager] fileExistsAtPath:self.persistentStorePath]) { 
     NSError *error = nil; 

     NSArray *stores = [self.persistentStoreCoordinator persistentStores]; 
     NSURL *storeUrls = [NSURL fileURLWithPath:persistentStorePath]; 
     for (NSPersistentStore *store in stores){ 

      if ([[store.URL absoluteURL] isEqual:[storeUrls absoluteURL]]) { 
       if (![self.persistentStoreCoordinator removePersistentStore:store error:&error]) { 
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
        abort(); 
       } 
       [[NSFileManager defaultManager] removeItemAtURL:store.URL error:&error]; 
       NSLog(@"Check store removed %@", [self.persistentStoreCoordinator persistentStores]); 
      } 
     } 
    } 

    NSURL *storeUrl = [NSURL fileURLWithPath:persistentStorePath]; 
    NSError *error = nil; 
    [self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]; 
    if (error) { 
     NSLog(@"event error %@ %@",error, [[self.persistentStoreCoordinator persistentStores] objectAtIndex:0]); 
    } 
    NSLog(@"Check store added %@",self.persistentStoreCoordinator.persistentStores); 

    [self.managedObjectContext unlock]; 

}else { 
    [self cancelDownload]; 
    NSLog(@"event cancel %@ %@ %@",previousDate, dateModified, [self.persistentStoreCoordinator persistentStores]); 
} 
} 

解決 亨特指出,下面我PSC配置設置爲無。所以數據不會被添加到每個Persistent Store中。當我在覈心數據模型中創建配置並針對相關實體時,我將PSC設置爲具有該配置。然後它按預期工作。見下文。

NSURL *storeUrl = [NSURL fileURLWithPath:persistentStorePath]; 
NSError *error = nil; 
[self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:@"ConfigEvent" URL:storeUrl options:nil error:&error]; 
if (error) { 
    NSLog(@"event error %@ %@",error, [[self.persistentStoreCoordinator persistentStores] objectAtIndex:0]); 
} 
NSLog(@"Check store added %@",self.persistentStoreCoordinator.persistentStores); 
+0

我不完全清楚你爲什麼認爲你需要兩家商店?你能詳細說明嗎?我可能會提出一些更簡單的建議......至於上述情況,除非明確地管理,否則不能指望數組中的各種職位。如果你在你的兩家商店設置,你可能想明確引用他們與伊娃或財產。 – Hunter

+0

您可以詳細說明您看到的失敗,聽起來您在添加新商店後無法從您的MOC中讀取對象。這與永久存儲陣列中持久存儲的索引有什麼關係? – ImHuntingWabbits

+0

需要注意的是 - 如果(錯誤) - 你可能不想這樣做 - NSError通常可以包含垃圾值 - 如果addPersistentStoreWithType返回nil(表示錯誤條件),最好記錄錯誤。 – Hunter

回答

2

如果你真的需要兩個店[我無法從你的解釋告訴我們,如果這是真的做到這一點的最好辦法],你可能想引用它們通過屬性或伊娃而不是依靠數組。

或者,您可以遍歷PSC的存儲陣列,並通過檢查URL來識別每個存儲陣列。

更新:

如果您無法存儲在不同的NSPersistentStores具體的數據,看看核心數據結構。這允許您告訴Core Data將特定的實體放入特定的持久性存儲中。

您可以在模型中指定配置並添加持久存儲。更多這裏:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdMOM.html

+0

我想我的問題可能需要更新以涵蓋我所嘗試的內容。爲了刪除正確的持久存儲,我遍歷數組並比較URL以確保我刪除了正確的一個。日誌證實了這一點。將新店重新加入PSC時,我的問題似乎就會發生。默認情況下,它總是添加到Persistent Store數組的末尾。所以當我將新數據與MOC合併時,它有錯誤的索引,並隨後將數據添加到錯誤的存儲區。也許我應該嘗試添加另一個MOC? – Jim

+0

它看起來像你的權利。我沒有正確設置我的核心數據配置來定位每個持久性存儲。我假設新添加的數據正確地被添加到每個商店,但是當我檢查它是空的。非常感謝你! – Jim

+1

更新:使用配置現在可以正確設置它的全部按預期工作。我遇到的唯一問題是「默認」不是有效的配置名稱。再次感謝。 – Jim

0

您應該可以通過一個持久性存儲協調器和兩個受管理對象上下文來實現這一點。如果您遇到鎖定會影響性能,您只需要去解決兩個持久店鋪協調員的複雜問題。

記住:最簡單可行的事情(TM)

+0

??我只使用一個與一個ManagedObjectContext關聯的持久存儲協調器。也許我太簡單了。 – Jim