Tag: 核心数据

无法find实体的NSManagedObjectModel

这是在viewDidLoad中的fetchRequest的代码,从这里find的教程后面的代码只是我编程链接导航控制器和tableview,而不是使用接口生成器。 实体ProductInfo存在。 但是,当我运行该程序时,我得到的错误: Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name 'ProductInfo'' 我已经重置模拟器,因为它是一个旧的模型,但仍然发生错误。 我也切换到使用FetchedResultsController但问题仍然存在。 问题是因为这些fetchedResultsController方法不在appdelegate内部吗? 他们目前在一个TableViewController。 我怎么解决这个问题? viewDidLoad方法: – (void)viewDidLoad{ NSFetchRequest * fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription * entity = [NSEntityDescription entityForName:@"ProductInfo" inManagedObjectContext:context]; [fetchRequest setEntity:entity]; NSError * error; self.productInfos = [_context executeFetchRequest:fetchRequest error:&error]; [fetchRequest release]; […]

NSPredicate的内存中和数据库内部评估给出了不同的结果

考虑谓词( NSPredicate predicateWithFormat: (x | 0) == x 针对x是64位整数的对象进行评估。 当然,这应该总是被评估为真实的。 当对一个数据库进行评估(取得谓词持有的logging)时,这是有效的,但是当在内存中进行评估时,这只有在 x <= 0x40000000 由于NSPredicate文档指出,逻辑操作数的操作数被视为32位有符号整数,但是由相同的“逻辑”对核心数据(更可能是SQLite)的谓词进行评估,这实际上会造成一些挫败感,是不正确的。 我可以看到两个解决scheme: 手动评估内存中的谓词,并希望Apple不会更改Core Data中NSPredicate的行为以匹配文档 以某种方式解决这个问题没有64位整数 他们都没有特别的吸引力。 任何其他解决scheme

在validateForInsert中执行获取请求过于昂贵

我最近在我的核心数据模型中做了一个重构传递,我从这里使用多层pipe理对象上下文模型: http : //www.cocoanetics.com/2012/07/multi-context-coredata/ 。 我已经成功地隔离了所有的核心数据parsing,以便新的托pipe对象被parsing并插入到后台线程的子MOC中,并且这些更改最终会批量保存到父/主MOC,然后写入持续的商店协调员通过其父母/作家MOC。 这已经稍微改善了我的UI响应能力,因为之前的大批量写操作是在父/主MOC上完成的,并locking了UI线程。 我想进一步改进我们的对象插入和validation。 每当应用程序打开,并在一个有点规律的时间间隔内,有一个configuration文件请求,在这个请求期间,有数十个或数百个对象以新的值发送。 我已经select为所有这些对象简单地创buildNSManagedObjects ,将它们插入到子MOC中,并允许validation来处理删除重复项。 我的问题是,是否每次调用validateForInsert :对于NSManagedObject NSFetchRequest ,执行NSFetchRequest都很昂贵。 我已经看到了几个似乎使用这种模式的StackOverflow的答案,例如: https : //stackoverflow.com/a/2245699/2184893 。 我想在创build实体之前执行这个操作,而不是进行validation,因为如果两个线程同时创build同一个对象,则两者都将被创build,并且validation必须在父线程的插入/合并时发生。 那么,使用这种方法是否昂贵? 这是常见的做法吗? 另外,使用validateForInsert和validate是否有区别? -(BOOL)validateUniqueField:(id *)ioValue error:(NSError * __autoreleasing *)outError{ // The property being validated must not already exist NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([self class])]; fetchRequest.predicate = [NSPredicate predicateWithFormat:@"uniqueField == %@", *ioValue]; int count = […]

删除核心数据中的对象,无法匹配Swift数组元素types

当我试图从我的核心数据删除对象,我得到这个错误: fatal error: NSArray element failed to match the Swift Array Element type 我必须明白为什么会发生这种情况。 我的表格视图被分成几个部分,也许和它有关系? 我从来没有从表视图中删除核心数据的任何问题,所以这是很奇怪的。 我的代码如下所示: var userList = [User]() var usernames = [String]() viewDidLoad(){ let appDel:AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate let context:NSManagedObjectContext = appDel.managedObjectContext! let fetchReq = NSFetchRequest(entityName: "User") let en = NSEntityDescription.entityForName("User", inManagedObjectContext: context) let sortDescriptor = NSSortDescriptor(key: "username", ascending: true) fetchReq.sortDescriptors […]

访问最终类的@NSManaged属性时发生Swift链接器错误

我在一个更大的项目中遇到问题,并将其简化为这个简单的代码。 为了演示目的,我使用Model.swift文件创build了一个新的Swift项目: import Foundation import CoreData class A: NSManagedObject { @NSManaged var foo: String } final class B: A { @NSManaged var bar: String } func testB(obj: B) -> String { return "\(obj.foo) \(obj.bar)" } 这编译,但链接器抱怨访问bar : Undefined symbols for architecture armv7: "__TFC21TestFinalManagedClass1Bg3barSS", referenced from: __TF21TestFinalManagedClass5testBFCS_1BSS in Model.o ld: symbol(s) not found for architecture armv7 […]

CoreData:无法加载实体的类

我在使用Core Data中的关系时遇到问题。 我创build了我的数据模型,其中包括以下实体:用户,对话,消息,参与者 – 每个实体都包含跟随它的实体的一对多关系。 我使用Editor-> Create NSManagedObject Subclass为每个实体生成类,并为每个类正确创build了.Swift文件。 该项目build立,但是当试图创build和保存一个新的用户时,我得到以下错误: 2014-12-01 12:31:28.450 Messenger[2627:151403] CoreData: warning: Unable to load class named 'Messenger.User' for entity 'User'. Class not found, using default NSManagedObject instead. 我确信我的实体类以项目/模块名称(Messenger.User)作为前缀。 我还在用户类的正上方添加了“@ObjC(用户)”,并为项目中的“其他链接器标志”添加了“-ObjC”,正如其他职位人员所build议的那样。 这些都是我可以find的所有修复,但我仍然得到相同的错误。 以下是我的User类的样子,供参考: import Foundation import CoreData @objc(User) class User: NSManagedObject { @NSManaged var api : API @NSManaged var username: String @NSManaged var […]

没有出现保存的图像

我试图用Core Data保存我的照片,但是,当我拍照并返回到DetailViewController ,在UIImageView中看不到任何东西。 让我解释到底发生了什么:用户按下“添加个人资料图片”button,提示他们拍摄照片后正常拍照,显示照片的预览,用户可以重新拍照或保存照片图片。 当他们推动保存图像时,ViewController将被解散,在UIImageView中看不到任何照片,当我按下保存并返回到这个视图控制器时,在UIImageView没有任何东西可以看到。 我在下面列出了我的代码。 -(void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. if (self.device) { [self.scoutNameText setText:[self.device valueForKey:@"name"]]; [self.scoutContactText setText:[self.device valueForKey:@"number"]]; [self.scoutTeamText setText:[self.device valueForKey:@"team"]]; [self.email setText:[self.device valueForKey:@"email"]]; [self.pick1 setText:[self.device valueForKey:@"pick1"]]; [self.pick2 setText:[self.device valueForKey:@"pick2"]]; [self.pick3 setText:[self.device valueForKey:@"pick3"]]; [self.pick4 setText:[self.device valueForKey:@"pick4"]]; [self.pick5 setText:[self.device valueForKey:@"pick5"]]; [self.pick6 setText:[self.device valueForKey:@"pick6"]]; [self.jobtitle setText:[self.device valueForKey:@"jobtitle"]]; […]

核心数据主要上下文并发性

所以我在过去的几个星期里一直在阅读和使用Core Data,并且使用以下设置来实现我的Core Data堆栈: 保存上下文 – 与商店绑定的根上下文,位于PrivateQueue上 主要上下文 – 在主线程上运行,保存上下文的subprocess 编辑上下文 – 在任何线程中按需创build,以编辑背景中的UI数据作为主要上下文的子项 有了这个设置,我没有任何问题,我已经采取了必要的预防措施,以防止多个背景编辑上下文同时调用[editMoc保存],但我没有看到相对于主线程是如何安全的/上下文。 具体来说,我在使用这个设置时看到的所有代码如下所示: [edit performBlock^{ [edit save:nil]; [main performBlock:^{ [main save:nil]; [root performBlock…] }]; }]; 现在我无法想象的是这样的:每当子环境保存时,数据就被传播到主环境中,但是没有任何事情发生,以确保数据当前不被读取/执行在主要的背景下,对吗? 基本上,我觉得像这样的事情会更合适: [edit performBlock^{ dispatch_async(dispatch_get_main_queue(), ^{ [edit save:nil]; }); [main performBlock:^{ [main save:nil]; [root performBlock….] }]; }]; 至less如果这样做,我们会确保传播相对于主线程/ UI是安全的,不是吗? 这种关系与我的另一个问题“为什么主要的语境真的应该和主线程有关呢?” 现在,如果我需要执行读取操作,我可以从主要的上下文中进行读取,而且我可以理解,在主线程中它是有意义的,但是如果传播只是“随时”发生的(因为我们不是在主线程中执行它们)将主线程绑定到底的最终目的是什么? 我甚至不需要去做,因为数据似乎已经从孩子保存的主要背景中抵达了,是吗? 从那里一个简单的[tableView重载]就足够了。 任何帮助表示赞赏! 编辑: 所以我想我已经find了我的问题的答案,那就是Core Data实际上是在内部使用正确的线程将更改从子上下文推送到父上下文(即使用父上下文的队列 – 在这种情况下会成为主队列)。 […]

Coredata错误setObjectForKey:对象不能为零

我尝试检查我的coredata存储中是否有任何数据作为我的应用程序的恢复types。 基本上,如果用户在最后的视图中有一些数据在coredata,他们不断更新。 所以他们在最后的观点,然后应用程序中断,或者他们把它睡觉,然后应用程序从内存中删除。 当应用程序下次加载时,我检查我的coredata对象,看看是否有任何值如果有我提示用户告诉他们有未完成的工作,你想从你离开的地方继续新鲜的。 如果他们想从头开始,我会转储任何目前在我的核心数据,并允许他们工作。 否则,我跳到最后一个视图加载在coredata中的数据,并让他们继续工作。 然而,这是错误发生的地方我检查我的coredata像这样。 NSMutableArray *checkFinMutableArray = [coreDataController readFin]; if ([checkFinMutableArray count] > 0) { //Show mesage, recover or not? UIAlertView *alert = [[UIAlertView alloc] init]; [alert setTitle:@"Selected projects avalible"]; [alert setMessage:@"It appears that you have unfinished projects from a previous session. Would you like to continue working on these projects?"]; [alert […]

NSManagedObjectContext的performBlockAndWait:不在接收者的队列上执行

我注意到NSManagedObjectContext和NSMainQueueConcurrencyType NSManagedObjectContext执行NSMainQueueConcurrencyType :并且在接收者(主)队列以外的队列上执行该块。 例如,如果我的parentContext的types为NSMainQueueConcurrencyType并且我的childContext的types为NSPrivateQueueConcurrencyType ,那么下面的代码将导致我的parentContext执行childContext的队列上的块: [childContext performBlockAndWait:^{ //Thread 1, Queue: NSManagedObjectContext Queue [parentContext performBlockAndWait:^{ //Thread 1, Queue: NSManagedObjectContext Queue //This is the same queue as the child context's queue }]; }]; 相反,下面的代码按预期工作 – 我的parentContext执行主队列上的块: [childContext performBlock:^{ [parentContext performBlockAndWait:^{ //Thread 1, Queue: com.apple.main-thread }]; }]; 这是预期的行为? 由于docs的状态为"performBlockAndWait: synchronously performs a given block on the receiver's queue."所以这当然令我感到困惑"performBlockAndWait: […]