CoreDataEnvir(自2011-05-25)最新版本0.4
CoreDataEnvir是一个CoreData包装器,它以方便的方式使用CoreData,并提供在并发编程中的线程安全。您可以并发使用,在单个线程上运行单独的CoreDataEnvir实例。
第一步
注册您的数据库名称
[CoreDataEnvir registDatabaseFileName:@"db.sqlite"];
注册您的模型文件名(不含文件扩展名)
[CoreDataEnvir registModelFileName:@"SampleModel"];
简单的数据库访问
假设Book
类代表读书应用中的书籍对象,它有一些字段是name
,author
等。
有一位作者“John Stevens Cabot Abbott”写过一本书名为“Napoleon Bonnaparte”。
添加新记录
[Book insertItemWithFillingBlock:^(id item) {
item.name = @"CoreData tutorial";
item.author = @"Headwindx";
}];
获取大量记录
//Find all books of John Stevens Cabot Abbott.
NSArray *books= [Feed itemsWithFormat:@"author = %@", @"John Stevens Cabot Abbott"];
获取一条记录
//Find one book model object.
Book *book = [Book lastItemWithFormat:@"name = %@ && author = %@", @"Napoleon Bonnaparte", @"John Stevens Cabot Abbott"];
删除一条记录
[CoreDataEnvir asyncMainInBlock:^(CoreDataEnvir *db) {
[db deleteDataItem:book];
}];
删除记录
[CoreDataEnvir asyncMainInBlock:^(CoreDataEnvir *db) {
[db deleteDataItemSet:books];
}];
并发编程
在主线程上
您可以在主线程上进行一些轻量级操作。以上所有操作默认必须运行在主线程上,否则将抛出由 CoreDataEnvir
引起的异常。因此,您应该小心处理。
您也可以显式使用主线程
这会让你感到更安全 :)
[CoreDataEnvir asyncMainInBlock:^(CoreDataEnvir *db) {
[Book insertItemWithFillingBlock:^(id item) {
item.name = @"CoreData tutorial";
item.author = @"Headwindx";
}];
}];
在后台线程上
已在CoreDataEnvir
中为您准备了一个后台 GCD 队列。
当asyncBackgroundInBlock
块中的void(^)(CoreDataEnvir *db)
工作完成后,将内存缓存保存到数据库文件。
您不需要像旧版本一样使用[db saveDataBase];
。
[CoreDataEnvir asyncBackgroundInBlock:^(CoreDataEnvir *db) {
[Book insertItemOnBackgroundWithFillingBlock:^(id item) {
item.name = @"CoreData tutorial";
item.author = @"Headwindx";
}];
}];
这使得并发编程更加方便。
方便的方法
必须在主队列上运行
+ (void)asyncMainInBlock:(void(^)(CoreDataEnvir *db))CoreDataBlock;
+ (id)insertItemWithFillingBlock:(void(^)(id item))fillingBlock;
+ (NSArray *)itemsWithFormat:(NSString *)fmt,...;
...
必须在后台队列上运行,您可以使用这些 API 和一些名为 Background
的方法
+ (void)asyncBackgroundInBlock:(void(^)(CoreDataEnvir *db))CoreDataBlock;
+ (id)insertItemOnBackgroundWithFillingBlock:(void (^)(id item))fillingBlock;
+ (NSArray *)itemsOnBackgroundWithFormat:(NSString *)fmt,...;
...
或者您想在您自己的 dispatch 队列中运行某些操作,您可以选择以下 API
+ (CoreDataEnvir *)createInstance;
您最好保留此实例以供将来使用。- (void)asyncInBlock:(void(^)(CoreDataEnvir *db))CoreDataBlock;
如果您是 CoreData 新手,请遵守以下规则
-
如果您想要保留您的 NSManagedObject 对象,您不应该释放您的 CoreDataEnvir 对象,否则会发生错误。
-
如果您在多个线程中操作数据库,您应该确保您有一个单独线程或 GCD 队列中的 NSManagedObjectContext。否则,当一个线程读取数据而另一个线程正在写入数据时,将会发生冲突。
PS:因此,在 CoreDataEnvir 中,请确保在主线程上从 [CoreDataEnvir mainInstance] 获取 NSManagedObject 对象引用,或在后台线程上从 CoreDataEnvir 提供的 [CoreDataEnvir backgroundInstance] 获取引用,而且这个引用在应用程序存在期间不会释放,这通常是足够的。