gpt4 book ai didi

iphone - 使用 PersistentStoreCoodinator 管理多个 NSPersistentStores

转载 作者:行者123 更新时间:2023-11-29 11:13:27 25 4
gpt4 key购买 nike

我正在尝试让 NSPersistentStoreCoordinator 管理多个持久存储的删除和插入。到目前为止,我已经成功地为 PSC 配置了两个商店,并且我已经能够通过指定其索引来删除其中一个商店。

像这样……

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 配置设置为零。所以数据没有被添加到每个单独的持久存储中。当我在核心数据模型中创建配置并将相关实体作为目标时,我将 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);

最佳答案

如果您确实需要这两个商店 [从您的解释中我无法判断这是否真的是最好的方法],您可能希望通过属性或 ivar 来引用它们,而不是依赖数组。

或者,您可以遍历 PSC 的商店数组并通过检查 URL 来识别每个商店。

更新:

如果您在将特定数据存储在不同的 NSPersistentStores 中时遇到问题,请查看 Core Data 配置。这允许您告诉 Core Data 将特定实体放入特定持久存储中。

您在模型中指定配置,并在添加持久存储时指定配置。更多信息:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdMOM.html

关于iphone - 使用 PersistentStoreCoodinator 管理多个 NSPersistentStores,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10516159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com