我一直在开发一个使用领域模型的iphone应用程序,并推迟了应用程序的持久性方面。 核心数据看起来像是一个非常好的解决scheme,因为我已经有了一个定义良好的模型,但是我现在正在用现有的unit testing来解决问题。 这里是我现在拥有的简单例子: – (void)test_full_name_returns_correct_string { Patient *patient = [[Patient alloc] init]; patient.firstName = @"charlie"; patient.lastName = @"chaplin"; STAssertTrue([[patient fullName] isEqualToString:@"charlie chaplin"], @"should have matched full name"); } 我的Patient对象从NSManagedObject扩展到firstName和lastName属性使用@dynamic时,我该如何做到这一点? 有没有其他人遇到这种types的核心数据? 谢谢。
我有一个BOOLtypes的属性,我想执行search所有这个属性是YES托pipe对象。 对于string属性很简单。 我创build一个这样的谓词: NSPredicate *predicate = [NSPredicate predicateWithFormat:@"userName = %@", userName]; 但是,如果我有一个名为selected的bool属性,我该如何做到这一点,我想做一个谓词呢? 我可以做这样的事吗? NSPredicate *predicate = [NSPredicate predicateWithFormat:@"selected = %@", yesNumber]; 或者我需要其他格式说明符,只是通过YES ?
现在在iOS5中真的很简单吗? 我曾经使用这个代码在我的AppDelegate中执行后台获取: dispatch_queue_t downloadQueue = dispatch_queue_create("DownloadQueue", NULL); dispatch_async(downloadQueue, ^{ self.myDownloadClass = [[MyDownloadClass alloc]initInManagedObjectContext:self.managedObjectContext]; [self.myDownloadClass download]; }); dispatch_release(downloadQueue); 我的下载类执行NSURLConnection来获取一些XML数据,使用NSXMLParser来parsing数据,然后更新核心数据中的复杂模式。 我会一直切换到主线程来实际更新核心数据。 凌乱的代码,大量调用dispatch_sync(dispatch_get_main_queue()… 我的新代码如下所示: NSManagedObjectContext *child = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSPrivateQueueConcurrencyType]; [child setParentContext:self.managedObjectContext]; [child performBlock:^{ self.myDownloadClass = [[MyDownloadClass alloc]initInManagedObjectContext:child]; [self.myDownloadClass download]; }]; 以及对我的AppDelegate中的一些其他代码的小改动,以将父模型对象上下文types设置为NSMainQueueConcurrencyType: – (NSManagedObjectContext *)managedObjectContext { if (__managedObjectContext != nil) { return __managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; […]
我有点烦恼搞清楚这个核心数据的东西。 如何创build一个具有唯一ID的新条目? 在SQL中,我只是将一个字段声明为一个自动增量字段。 我在这里没有看到类似的东西,但是我可能会错过一些东西。 我只是想要一个自动增加NSInteger字段,所以当我手动添加项目到数据库,我会有一些forms的参考。
我想保留NSUInteger到我的核心数据,我不知道应该使用哪种types(整数16,32,64)来适应所需的空间。 从我的理解 Integer 16 can have minimum value of -32,768 to 32,767 Integer 32 can have minimum value of -2,147,483,648 to 2,147,483,647 Integer 64 can have minimum value of -very large to very large 而NSUInteger是unsiged longtypes的def,它等于unsigned int( iPhone上的objective-c中的types ) 所以如果我将我的NSUInteger转换为NSNumber与numberWithUnsignedInteger:并将其保存为NSNumber(整数32)我可以安全地检索我的数据回来吗?
所以,它终于发生了。 对于任何独立的iPhone开发者来说,最糟糕的情况是 升级我的应用后,有几个用户报告完全丢失数据 。 iCloud核心数据同步不起作用。 我的用户正在使用这个应用程序部分运行他们的业务。 这真是一场灾难性的失败 。 我改变的唯一与iCloud相关的事情是将键值存储添加到iCloud。 核心数据代码保持完全一样,相同的型号版本(不迁移)等 在我的testing中,一切都很好用! 但令我沮丧的是,用户报告说他们的数据在他们打开更新的应用程序时已经不存在了。 这可能是什么原因? 持久存储URL (无处不在的URL)不应该改变。 合并冲突也不太可能,因为在更新之前应该出现这个问题。 一些干扰新的无处不在的键值存储也许? (我几乎排除了这一点。) 下面请find我的托pipe对象模型和持久存储的代码。 让我知道你是否需要别的什么来评估这个问题。 – (NSManagedObjectContext *)managedObjectContext { if (managedObjectContext_ != nil) { return managedObjectContext_; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (coordinator != nil) { managedObjectContext_ = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; [managedObjectContext_ performBlockAndWait:^{ [managedObjectContext_ setPersistentStoreCoordinator:coordinator]; if (useICloud) { [managedObjectContext_ […]
看起来在11月份,苹果公司更新了NSManagedObjectContext类参考和核心数据编程指南文档,明确祝福串行GCD调度队列和NSOperationQueues作为同步访问NSManagedObjectContext可接受机制。 但是他们的build议似乎是模棱两可的,可能是矛盾的,我想确保我已经正确地理解了。 以前,人们公认的NSManagedObjectContext是NSManagedObjectContext只能从创build它的线程访问,而使用串行队列进行同步是不够的; 尽pipe串行队列一次只能执行一个操作,但是这些操作可能会在不同的线程上进行调度,而且MOC不这样做。 但现在,从节目指南,我们有: 您可以使用线程,串行操作队列或分派队列进行并发。 为了简洁起见,本文使用“线程”来指代其中的任何一个。 到目前为止,这么好(虽然他们的线程和队列的合并是无益的)。 所以我可以安全地使用每个(串行)队列的单个上下文,而不是每个操作/块一个,对不对? 苹果甚至在核心数据WWDC会议中对此进行了视觉描述。 但是…你在哪里创build队列的上下文? 在NSManagedObjectContext文档中,Apple声明: [上下文]假定默认所有者是分配它的线程或队列 – 这是由调用其init方法的线程决定的。 因此,您不应该在一个线程上初始化上下文,然后将其传递给另一个线程。 所以现在我们有一个NSManagedObjectContext的想法需要知道谁是它的所有者。 我假设这意味着要在队列中执行的第一个操作应该创buildMOC并保存对其余操作的引用。 这是正确的吗? 我犹豫的唯一原因是NSManagedObjectContext文章继续说: 相反,您应该将一个引用传递给一个持久性存储协调器,并让接收线程/队列创build一个由此产生的新的上下文。 如果使用NSOperation,则必须在main(对于串行队列)或start(对于并发队列)中创build上下文。 现在,苹果似乎正在将运营与排期执行的队列进行混合。 这是我的头脑,让我怀疑他们是否真的希望你为每一个操作创build一个新的商务部。 我错过了什么?
我正在实现一个search字段,用户可以input一个string来筛选视图中显示的项目。 每个显示的对象都有一个keywords一对多的关系,我希望能够根据关键字过滤对象。 每个关键字对象都有一个name属性,所以我设置了一个NSPredicate来执行过滤,如下所示: NSPredicate* predicate = [NSPredicate predicateWithFormat:@"keywords.name CONTAINS %@", self.searchString]; 这是有效的,但问题是search是区分大小写的,所以如果关键字有一个大写字母,但用户input全部小写,则不会find匹配项。 我已经尝试了以下修改: NSPredicate* predicate = [NSPredicate predicateWithFormat:@"keywords.name CONTAINS[c] %@", self.searchString]; 但是,在匹配的大小写敏感性方面没有任何区别。 有没有办法使用只是一个简单的谓词做这种不区分大小写的匹配? 或者我是否需要在关键字类上实现某种自定义访问器,例如,编写一个lowercaseName方法,并匹配searchstring的小写版本? 附录:在进一步的研究之后,添加自定义访问器的解决方法对于手动使用NSPredicate而言工作正常,但是在使用Core Data的NSFetchRequest时根本不起作用,只有在查询Core Data模型中定义的属性时才起作用。
我已经在Xcode中创build了我的模型,实体,属性和关系。 我的实体的类是如何创build的? 我必须手动创build它们吗?
在iOS 5中, NSManagedObjectContext有一些新的方法, performBlock:和performBlockAndWait: 这些方法实际使用的是什么? 他们在旧版本中取代什么? 应该传递什么样的信息给他们? 我如何决定使用哪个? 如果有人使用它的一些例子,那就太好了。