我試圖讓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);
我不完全清楚你爲什麼認爲你需要兩家商店?你能詳細說明嗎?我可能會提出一些更簡單的建議......至於上述情況,除非明確地管理,否則不能指望數組中的各種職位。如果你在你的兩家商店設置,你可能想明確引用他們與伊娃或財產。 – Hunter
您可以詳細說明您看到的失敗,聽起來您在添加新商店後無法從您的MOC中讀取對象。這與永久存儲陣列中持久存儲的索引有什麼關係? – ImHuntingWabbits
需要注意的是 - 如果(錯誤) - 你可能不想這樣做 - NSError通常可以包含垃圾值 - 如果addPersistentStoreWithType返回nil(表示錯誤條件),最好記錄錯誤。 – Hunter