我正在尝试更新实现核心数据存储的应用程序。 我正在为其中一个实体添加一个属性。 我将下面的代码添加到我的委托类: – (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (persistentStoreCoordinator != nil) { return persistentStoreCoordinator; } NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"Shoppee.sqlite"]]; NSError *error = nil; persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) { NSLog(@"Error: […]
我正在准备iOS 7的基于核心数据的应用程序的更新修复。我使用Xcode 5和iOS 7 SDK GM。 然而,我意识到持久性存储(这是一个UIManagedDocument )的不同行为:在iOS 7构build之前,文档文件夹中只有一个文件persistentStore (有时还有第二个persistentStore-journal )。 在iOS 7构build(干净安装)中,现在有三个文件用于持久性存储: persistentStore persistentStore-wal和 persistentStore-shm 苹果是否现在默认更改日记模式为WAL? 我想知道是否对我的应用程序有影响(想想用户如何从最新版本更新)? 最好是禁用WAL – 如果是的话,我怎样才能做到这一点与iOS 7 / UIManagedDocument ?
我需要为NSManagedObject子类中的字段(我们将它称为foo )编写自定义setter方法。 foo在数据模型中定义,Xcode分别在.h和.m文件中自动生成@dynamic和@dynamic字段。 如果我这样写我的二传手: – (void)setFoo: (NSObject *)inFoo { [super setFoo: inFoo]; [self updateStuff]; } 然后我得到一个编译器警告在super的调用。 或者,如果我这样做: – (void)setFoo: (NSObject *)inFoo { [super setValue: inFoo forKey: inFoo]; [self updateStuff]; } 那么我将无限循环地结束。 那么,为NSManagedObject的子类编写自定义setter的正确方法是什么?
通常,核心数据应用程序的sqlite存储文件位于 库>应用程序支持> iPhone模拟器> 7.1(或您正在使用的版本)>应用程序>(无论哪个文件夹包含您的应用程序)>文档 文件夹,但我不能在IOS 8中find它。我假设他们只会在iPhone模拟器文件夹中添加一个8.0文件夹,但它不在那里。 有人能find它吗?
我在苹果提供的示例代码中看到了如何处理核心数据错误。 即: NSError *error = nil; if (![context save:&error]) { /* Replace this implementation with code to handle the error appropriately. abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to […]
CoreData实体“A”使用级联删除规则与CoreData条目“B”的集合具有一对多关系。 在iCloud环境中,当设备1显示“B”条目之一的详细视图时,设备2删除“A”条目。 当设备1接收到NSPersistentStoreDidImportUbiquitousContentChangesNotification通知时,其App Delegate调用mergeChangesFromContextDidSaveNotification ,然后广播由视图控制器捕获的内部通知,显示条目“B”的细节(代码使用performBlock )。 但是,尽pipe在详细视图控制器接收到内部通知时入口“A”确实无效,但条目“B”仍然作为有效的CoreData对象存在。 看来级联规则还没有完成。 因此,设备1中的视图控制器不知道删除,这可能会导致意外的结果。 mergeChangesFromContextDidSaveNotification出现提前返回,当基础数据已合并,但级联规则尚未完成。 当通知到达时,我尝试刷新条目“B”,同时暂时将pipe理对象上下文的stalenessInterval设置为零,以便caching的对象不会被使用,但是我仍然从商店获得有效的条目“B”。 在这一点上检查null条目“A”不是一个选项,因为情况比我在这里描述的要复杂一些,在某些情况下空条目“A”是有效的。 我试图在合并更改之后并在将内部通知发送到视图控制器之前引入延迟。 我发现延迟2秒没有帮助,但延迟10秒。 但我不想依赖这个延迟。 这是一个没有太多数据的testing环境,我不知道在生产环境中会发生什么。 依靠实验性延迟似乎不是正确的做法。 有没有正确的事情? 还是我做错了,开始?
嘿,我在这里为我们的应用程序的模型层工作。 一些要求是这样的: 它应该在iPhone OS 3.0+上工作。 我们的数据来源是一个RESTful Rails应用程序。 我们应该使用Core Data在本地caching数据。 客户端代码(我们的UI控制器)应该尽可能less地了解networking内容,并且应该使用Core Data API查询/更新模型。 我已经检查了构build服务器驱动用户体验的WWDC10会议117 ,花了一些时间检查Objective Resource , Core Resource和RestfulCoreData框架。 目标资源框架本身不与Core Data交谈,仅仅是一个REST客户端实现。 Core Resource和RestfulCoreData都假设你在代码中和Core Data交谈,他们解决了模型层背景中的所有细节。 所有目前看起来都不错,最初我通过核心资源或RestfulCoreData将覆盖所有上述要求,但是…有几件事似乎并没有正确解决: 在保存本地更新到服务器时,主线程不应该被阻塞。 如果保存操作失败,则错误应该传播到UI,并且不应该将更改保存到本地Core Data存储。 核心资源碰巧发出所有的请求到服务器,当您调用- (BOOL)save:(NSError **)error您的托pipe对象上下文,因此能够提供一个正确的NSError实例的底层请求到服务器失败不知何故。 但它会阻止调用线程,直到保存操作结束。 失败。 RestfulCoreData保持你的 – 保存-save:调用保持不变,并且不会为客户端线程引入额外的等待时间。 它只是注意NSManagedObjectContextDidSaveNotification然后发出相应的请求到通知处理程序中的服务器。 但是这样, -save:调用总是成功完成(当然,如果Core Data与已保存的更改一致,并且实际调用它的客户端代码无法知道保存可能无法传播到服务器,因为有些404或421或任何服务器端发生错误。 而且,本地存储变得更新了数据,但是服务器从来不知道这些变化。 失败。 所以,我正在寻找解决所有这些问题的可能的解决scheme/常见做法: 当networking请求发生时,我不希望调用线程在每个-save: call上阻塞。 我想以某种方式获取通知在用户界面中,一些同步操作出错。 如果服务器请求失败,我希望实际的Core Data保存失败。 有任何想法吗?
我正在开发一个通用的iOS应用程序,我想在debugging时看到日志中的原始SQL。 在这篇博文中有一些关于如何为iOS Core Data开发启用原始SQL日志logging的信息。 给出的例子是XCode 3,它只是不清楚如何在XCode 4中启用它。 我试过“产品” – >“编辑计划”,并添加“ -com.apple.CoreData.SQLDebug 1 ”到“启动时通过的参数”,但我仍然没有看到日志中的任何输出。 不知道我是否在错误的地方看,或只是传递错误的参数。
一直在我的第一次在核心数据的裂缝,我在我的设备上运行我的代码时得到以下错误,但它在模拟器上正常工作.. *终止应用程序,由于未捕获exception“NSInvalidArgumentException”,原因:'无法创build一个nil模型的NSPersistentStoreCoordinator' 我的一些方法可能会导致这个问题: – (NSManagedObjectContext *)managedObjectContext { if (__managedObjectContext != nil) { return __managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (coordinator != nil) { __managedObjectContext = [[NSManagedObjectContext alloc] init]; [__managedObjectContext setPersistentStoreCoordinator:coordinator]; } return __managedObjectContext; } /** Returns the managed object model for the application. If the model doesn't already exist, it is created from […]
我正在创build一个应用程序,我想要保存,同步和备份数据的早期阶段。 该应用程序不会存储任何文件只是数据库中的数据。 这将是iOS 8和以上,所以我能够使用CloudKit。 我做了一些研究,但仍不清楚Core Data,iCloud和CloudKit是如何协同工作的。 据了解,CloudKit只是从云端获取数据和从云端获取数据的一种方式。 CloudKit是与iCloud同步数据的另一种方式吗? 我的问题是: 如果我使用CloudKit,是否还需要创build本地核心数据库? 如果是,它会自动与iCloud同步,或者我将不得不调用方法来存储到两个地方? 如果数据只存储在云中,那么当iOS设备没有连接到互联网时,用户将能够访问它。 我读到,CloudKit只有有限的caching。 如果iCloud帐户未启用,这将如何工作。 如果有人能够在保存并同步核心数据库的同时离线和在线地分解每项技术所做的工作。 我目前的理解是: 核心数据用于本地存储数据 iCloud同步数据并存储在云中 CloudKit能够存储和pipe理云中的数据? 我希望我提供了足够的信息,不要closures这个问题。