CoreDataEnvir 0.13.0-beta.0

CoreDataEnvir 0.13.0-beta.0

Deheng Xu维护。



CoreDataEnvir 0.13.0-beta.0

CoreDataEnvir(自2011-05-25)最新版本0.4

CoreDataEnvir是一个CoreData包装器,它以方便的方式使用CoreData,并提供在并发编程中的线程安全。您可以并发使用,在单个线程上运行单独的CoreDataEnvir实例。

第一步

注册您的数据库名称

	[CoreDataEnvir registDatabaseFileName:@"db.sqlite"];

注册您的模型文件名(不含文件扩展名)

	[CoreDataEnvir registModelFileName:@"SampleModel"];

简单的数据库访问

假设Book类代表读书应用中的书籍对象,它有一些字段是nameauthor等。

有一位作者“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] 获取引用,而且这个引用在应用程序存在期间不会释放,这通常是足够的。

Bitdeli Badge