- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试让 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/
我想将文件移至我的 iOS 应用程序的 CoreData 存储 ../Library/Application Support/MyApp/ 至 ../Documents/Stores/ 我可以使用 N
我有一个 iOS 应用程序,我在其中使用 coreData 来存储我的“文档”。它们都共享一个公共(public)的 NSManagedObjectContext,我经常保存上下文。 我想跟踪各种“文
我正在尝试在我的 CoreData+CloudKit 项目中执行历史跟踪,该项目使用 NSPersistentCloudKitContainer .我一直在关注 Apple 的 sample proj
Swift版本:swift3.0目标iOS版本:10.0 我尝试为涉及核心数据的函数编写单元测试。所以我想做的第一件事就是用 NSPersistentStore 类型初始化类变量。 这是我的类变量代码
我正在尝试将我的 NSPersistentStore 从我的应用程序的沙箱移动到共享组容器,以便我可以从我的 WatchKit 扩展访问 CoreData。我目前正在将 Core Data 与 iCl
长话短说,我的 Core Data 模式被更改,我的应用程序被提交到应用程序商店,这导致所有更新应用程序的人都崩溃了。崩溃是由于未正确迁移数据模型而导致缺少 NSPersistentStore 造成的
我正在开发一个分阶段推出的应用程序。对于每个冲刺,都有数据库更改,因此已经实现了核心数据迁移。到目前为止,我们已经发布了 3 个阶段。每当完成连续渐变时,应用程序运行良好。但是每当我尝试从版本 1 升
我正在尝试让 NSPersistentStoreCoordinator 管理多个持久存储的删除和插入。到目前为止,我已经成功地为 PSC 配置了两个商店,并且我已经能够通过指定其索引来删除其中一个商店
let managedModel:NSManagedObjectModel = NSManagedObjectModel.mergedModelFromBundles(nil)! va
有没有办法在知道 URL 的情况下检索 NSPersistentStore? 类似于: NSURL *url = @"aaa\bbbb\ccc\xyz.sqlite" NSPersistenStore
我正在探索 Core Data 自定义迁移,为此我需要在现有商店上运行测试以查看它是否与当前加载的妈妈兼容。为此,我需要从商店获取元数据。 所以我在 AppDelegate 类中这样做: NSFile
我想将只读示例/教程数据添加到基于 Core Data 的 macOS 应用程序。 我将在包含示例数据的应用程序包中包含一个 SQL 文件。我的 NSPercientContainer 将有 2 个
我正在(通过 Dropbox)实现用户的Core Data 持久数据的备份和恢复。为了进行恢复,我从 Dropbox 中提取文件并将它们临时存储在 Documents 目录中。然后,我创建一个新的 N
我修改了通过核心数据应用程序获得的样板核心数据堆栈代码,将两个 NSPersistentStore 添加到 NSPersistentStoreCoordinator 而不是一个。 // MARK: -
这是我正在尝试做的事情: 我使用 NSFetchedResultsController 执行提取并使用其委托(delegate)跟踪更改 我下载了一些数据,根据某些情况,我有时会通过删除 NSPers
我正在开发一个带有 Core Data 的应用程序,它会定期从网络服务下载所有数据。由于下载可能会失败或被用户取消,因此我希望能够回滚到之前的状态。我尝试撤消 NSManagedObjectConte
此代码显示我的错误所在的位置: do { //error showing at this line if try coordinator!.addPersistentS
我花了很长时间来找出正确的方法来创建 Core-Data 支持的 .sqlite 文件的备份并将该备份存储在本地和/或 iCloud 中(无论用户喜欢什么)以供下载、还原或分享。让我先声明一下,我不是
我正在尝试将 SQLCipher 添加到一个使用 Magical Record 库来加密数据库的 iOS 项目。还使用加密核心数据项目中的 EncryptedStore 类:https://githu
我是一名优秀的程序员,十分优秀!