Tag: core data

在多对多关系中的KVO对象属性

我有一个由父<— >>子组成的核心数据对多关系。 我想build立一个键值观察机制,当任何一个Child对象的属性(例如firstName,lastName)改变时,它触发一个通知。 使用标准KVO语法时: [self.parentObject addObserver:self forKeyPath:@"children" options:NSKeyValueObservingOptionNew context:NULL] 这只会在关系本身被修改(即一个Child对象被添加或从关系中删除)时通知,而不是当这些Child对象之一的属性发生更改时。 显然这就是它的devise如何运作,所以没有什么错,但我怎样才能使用KVO来达到我想要的要求呢? 提前致谢!

是否有可能按“NSFetchRequest”中的子类进行sorting而不添加其他属性?

我想按实体NSFetchRequest的结果。 这些实体都共享相同的抽象父项。 例如: animal | |-cat | |-dog NSFetchRequest includesSubentities将TRUE和entity设置为animal的NSFetchRequest 。 可以将sectionNameKeyPath的entity.name设置为entity.name但由于sortDescriptors应用于存储的属性(即数据库中的数据,而不是方法),因此不可能对NSFetchRequest的sortDescriptors执行相同的操作类)。 因此按实体types分组的唯一方法是向超类添加一个属性,子类可以用来标识自己。 这看起来很疯狂,因为它破坏了inheritance的有用性。 我查看了SQLite数据库,实体types与属性存储在同一个表中,因此所需的数据已经就位。 总结:是否有可能通过NSFetchRequest的子类进行sorting而不添加其他属性?

UIManagedDocument NSFetchedResultsController和背景上下文

我正在尝试以下工作。 我有一个表格视图,显示从表格视图中的API获取的数据。 为此,我正在使用NSFetchedResultsController: self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.database.managedObjectContext sectionNameKeyPath:nil cacheName:nil]; 我在像这样的后台上下文中创build我的实体: NSManagedObjectContext *backgroundContext; backgroundContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; backgroundContext.parentContext = document.managedObjectContext; [backgroundContext performBlock:^{ [MyAPI createEntitiesInContext:backgroundContext]; NSError *error = nil; [backgroundContext save:&error]; if (error) NSLog(@"error: %@",error.localizedDescription); [document.managedObjectContext performBlock:^{ [document updateChangeCount:UIDocumentChangeDone]; [document.managedObjectContext save:nil]; }]; 现在,每当我得到新的数据(和插入/更新如上所示的实体),我的NSFetchedResultsController并不像它应该那样工作。 特别是,我总是更新一个实体(而不是创build一个新实体),但我的表视图显示两个实体。 一旦我重新启动应用程序,它显示正确。 如果我在self.database.managedObjectContext中创build实体([MyAPI createEntities]),一切正常。 任何想法我做错了什么? 通过这里的现有线索来看看,让我觉得我正在做正确的方式。 再次,如果我不做核心数据保存在背景上下文(但在document.managedObjectContext),那么它工作正常…

核心数据和iCloud添加预先填充的sqlite文件

我正在使用Core Data和iCloud在多个iPad之间同步数据的应用程序。 这一切都工作正常,我可以添加数据到每个iPad,它会同步它们之间的所有。 我有一个核心数据sqlite文件,预填充的国家列表,我想复制到应用程序的第一次运行文档区域。 我有这个工作,但已经改变了我的persistentStoreCoordinator实施,以testing是否支持iCloud和其他一些小的变化。 但是,现在当我检查,看是否存在sqlite文件,并复制预填充SQLite文件,如果没有我在下面的错误 [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:iCloudData] options:options error:&persistentStoreError]; NSPersistentStoreCoordinator addPersistentStoreWithType:configuration:URL:options:error :: CoreData:Ubiquity:设置无处不在集成时发生错误:Error Domain = NSCocoaErrorDomain Code = 134316“无处不在的容器似乎不匹配这个持久存储,这是可能的是由于切换到不同的iCloud帐户,或者完全从iCloud注销引起的,应该使用只读属性重新打开存储或从iCloud永久同步删除存储。 UserInfo = 0x1cb590 {storeUUID = 31381598-EAFA-4550-9B96-F501800974D5,containerUUID = E3A8DC7D-41FD-405A-8D8A-C06C8B467CA2,NSLocalizedDescription =无处不在的容器似乎不匹配这个永久性存储,这可能是由切换到另一个iCloud帐户,或完全注销iCloud。 商店应该以只读属性重新打开,或者从iCloud永久同步中删除。} 这是因为在iCloud中还有不同的Core Data sqlite文件或事务日志文件? 如果是这样,我将如何删除它们?

iOS 7完成处理程序永远不会被调用

在下面的代码中,没有一个完成处理程序被执行。 我能find的一个解释是iPhone Simulator 5.1中的这个Bug,使用UIManagedDocument的Xcode 4.5 。 它说这可能是iPhone模拟器5.1中的一个错误。 不过,我试过iPhone模拟器6.0,6.1和7.0,他们都没有工作。 我会很感激你的帮助。 (顺便说一下,我在斯坦福iOS课程中看到了这个代码,第14讲) NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; url = [url URLByAppendingPathComponent:@"DataDocument"]; UIManagedDocument *document = [[UIManagedDocument alloc] initWithFileURL:url]; if(![[NSFileManager defaultManager] fileExistsAtPath:[url path]]){ NSLog(@"This logs"); [document saveToURL:url forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success){ NSLog(@"This never logs"); }]; }else if(document.documentState == UIDocumentStateClosed){ NSLog(@"This logs"); [document openWithCompletionHandler:^(BOOL success){ NSLog(@"This never logs"); […]

将iCloud Store迁移到本地商店,并确保每次启动应用程序时都有数据

基于这里的问题: 将iCloud数据迁移到本地存储,并停止iCloud仍然响应将iCloud存储转移到本地存储,并确保iCloud通知被禁用,我有下一个scheme,我卡住了。 问题 现在,当用户在第一台设备上运行应用程序时,他们会在开始时询问是否要启用iCloud。 如果select“是”,则将数据迁移到iCloud。 如果用户在第二台设备上连接,则会在开始时询问是否要使用iCloud,如果select是,则会同步跨第一台设备的数据。 如果第二个设备上的用户决定不再使用iCloud,他们可以在该设备的应用程序中专门导航和closuresiCloud。 这在后端将他们的数据从iCloud商店迁移到本地商店。 从用户的angular度来看,他们所有的数据都存在(无论是存储在云中还是本地对用户而言都不重要)。 问题是当我迁移我的数据时,它成功迁移到本地iCloud存储并成功停止侦听iCloud通知。 这方面的工作,这是在我以前问(我的iCloud数据迁移到本地存储和停止iCloud仍然响应 )的堆栈溢出问题。 具体的问题是,当用户重新启动应用程序,应用程序现在是空的,没有数据。 这当然不是预期的效果。 为了完整起见,“迁移代码”基于另一个堆栈溢出问题,但为了方便,我在此粘贴: – (void)migrateiCloudStoreToLocalStore { NSLog(@"Migrate iCloudToLocalStore"); NSPersistentStore *store = self.persistentStoreCoordinator.persistentStores.lastObject; //NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Envylope.sqlite"]; NSURL *storeURL = [self.persistentStoreCoordinator.persistentStores.lastObject URL]; NSLog(@"Current Store URL (before iCloud to Local migration): %@", [storeURL description]); NSDictionary *localStoreOptions = nil; localStoreOptions = @{ NSPersistentStoreRemoveUbiquitousMetadataOption : […]

无法find迁移的映射模型 – UIManagedDocument核心数据迁移

我有两个版本的模型Model001.xcdatamodel和Model002.xcdatamodel 。 这两个在Model.xcdatamodeld包中。 我也有Model001to002.xcmappingmodel不是Model.xcdatamodeld一部分。 我检查:xcmappingmodel和xcdatamodeld都被复制到.app包中。 我的托pipe对象上下文是这样初始化的: NSURL *documentModel = [bundle URLForResource:@"Model" withExtension:@"momd"]; managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:documentModel]; return managedObjectModel; 我还在我重写的initWithFileURL:上设置了这些属性initWithFileURL:在我的UIManagedObject子类中。 NSMutableDictionary *options = [NSMutableDictionary dictionaryWithDictionary:self.persistentStoreOptions]; [options setObject:@YES forKey:NSMigratePersistentStoresAutomaticallyOption]; [options setObject:@YES forKey:NSInferMappingModelAutomaticallyOption]; self.persistentStoreOptions = [options copy]; 但是,当我尝试打开文档时,出现以下错误: Can't find mapping model for migration – 更新 – 即使我做了手动迁移 [NSMappingModel mappingModelFromBundles:@[[NSBundle mainBundle]] forSourceModel:sourceObjectModel destinationModel:self.managedObjectModel]; 这返回零。 虽然我仔细检查了Model001to002.cdm是在应用程序包中。 它必须在应用程序包正确?

核心数据中的获取属性

在我的核心数据模型中,一个Person有一个或多个Cars ,由无序的一对多关系“汽车”指定。 通常情况下,我需要检索按datePurchased或dateLastUsed订购的人车。 到目前为止,我已经将自己的方法添加到了carsByDatePurchased Person中。 这使用sorting描述符来sortingNSSet cars并返回一个NSArray。 可以/我应该使用一个Fetched属性吗? 每次我按照特定的顺序需要汽车时,我都会遇到一些使用sorting描述符的性能开销,即使实现我自己的carsByDatePurchasedcaching。 它看起来像获取的属性为我caching – 是正确的? 获取的属性与我自己的实现有什么限制? 关键是,被掠夺的财产的价值在执行之间是否持续? 如果我更新提取的属性并保存我的上下文,是下次启动应用程序时存储的值?

dynamicUITableView与核心数据对象的高度

过去几天我一直在试图解决一个谜团,为什么批量大小为20的NSFetchedResultsController会在抓取完成时立即将所有对象(即加载到内存)中的错误导致请求采取~20秒。 事实certificate,这是因为在我的heightForRowAtIndexPath,高度是基于每个获取的对象的NSString属性的长度,所以在重新加载表,如果该表有2000行,那么高度计算每行的一开始,由于我访问的是对象的文本属性,所以2000年的对象(20个批量的对象)在一开始就会出错,从而导致它永远消失。 (我不知道行高是在开始时计算的)。 所以问题是,如果我有一个批处理大小为20的获取结果控制器,但我的行高是基于对象的文本属性,如果我尝试访问会导致对象不再是一个错误了,但实际上加载到内存中,什么是计算高度的解决方法? 我有什么select?

核心数据多级父 – 子上下文

在我的应用程序中,我有UITableViewController显示事件列表。 该控制器使用ManagedObjectContext说ParentContext 。 现在,如果select了任何事件,则会显示详细的视图控制器,用户可以在其中编辑事件的详细信息。 所以我创build了一个小孩的上下文说, ChildContext with type "NSPrivateQueueConcurrencyType" ChildContext whose parent Context is "ParentContext". 我的代码是: NSManagedObjectContext *childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; childContext.parentContext = self.context ; 现在又有一些领域和关系需要再次深入研究。 所以我为新的视图控制器创build了另一个ChildContext说, GrandChildContext with type "NSPrivateQueueConcurrencyType" GrandChildContext whose parent context is "ChildContext" 这个过程进行到另一个级别(从父级(tableView)到子级总共4级) self.context – Parent Context | | ChildContext | | GrandChildContext | | GrandGrandChildContext 我的实体看起来像这样 EntityA — […]