基础知识:Core Data入门
查询语句:[IOS开发]CoreData条件查询之NSPredicate应用_超人_新浪博客
NSManagedObject
NSManagedObject的子类只是用于CoreData内部,它不能用于我们说的model。
我们是把数据model传给NSManagedObject的子类,然后用context把这个NSManagedObject的子类保存在数据库中。
在已建立的CoreData数据库中,取不出数据:
原因是:创建的context的ConcurrencyType为NSPrivateQueueConcurrencyType
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
因为,如果第一次创建的上下文context设置为private类型的话,第二次就获取不到这个上下文了,如果获取不到这个上下文,自然就取不出来以前的数据库的内容了。所以应该:
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
CoreData中的NSManagedObjectContext在多线程中不安全,如果想要多线程访问CoreData的话,最好的方法是一个线程一个NSManagedObjectContext,每个NSManagedObjectContext对象实例都可以使用同一个NSPersistentStoreCoordinator实例,这个实例可以很安全的顺序访�问永久存储,这是因为NSManagedObjectContext会在便用NSPersistentStoreCoordinator前上锁。
NSManagedObjectContext提供了initWithConcurrentcyType方法,其中的一个NSPrivateQueueConcurrencyType,会自动的创建一个新线程来存放NSManagedObjectContext而且它还会自动创建NSPersistentStoreCoordinator。
在实际的开发当中,我遇到了各种各样的问题,如果是多线程操作数据库的话,个人建议:
1: 最好一个线程对应一个NSManagedObjectContext。如果只有一个NSManagedObjectContext,并且多个线程对其进行操作,回出现许多不清不楚的问题。
2:在每一个线程对应一个NSManagedObjectContext的时候,尽量一个线程只读写与其对应的context。在其完成操作的时候通知另外的线程去修改其对应的context。在apple的api中有NSManagedObjectContextDidSaveNotification, 它可以帮助你通知修改其它的contexts。
上面的代码只是简单利用NSManagedObjectContextDidSaveNotification,当子线程修改了数据库以后,通知主线程去修改其对应的context。当然childThreadManagedObjectContext的创建是在创建子线程的时候进行的。