CoreData持久化框架





5.00/5 (1投票)
iOS CoreData 的轻量级对象包装器。
引言
CoreData 持久化库已经被实现,以简化和更容易地使用 Core Data 框架,并代表一个轻量级的对象包装器。 该项目灵感来自 kbucek 基于 Java 构建的持久化 API 框架。
背景
它专为常见的使用场景而设计,包括 Core Data 堆栈处理和基本对象(对象图)查询,或者对托管对象的某些属性使用投影。
它通过使用这些常见的模式:DAO(数据访问对象)和工厂,覆盖了基本的 Core Data 框架功能。
使用代码
该库有一组类,它们作为围绕 Cocoa 谓词的轻量级对象。 在以下部分中描述了持久化 API 的基本块。
首先,您需要在应用程序委托中设置存储数据文件的路径及其存储类型,紧挨着调用 applicationDidFinishLaunching
方法(例如,对于 SQLite 存储类型)。
- (void)applicationDidFinishLaunching:(UIApplication *)application {
[DAOFactory setStorePath:@"test.sqlite"];
[DAOFactory setStoreType:NSSQLiteStoreType];
...
文件 test.sqlite 是空的,或者是一个位于 Resources 组(Xcode)中的预填充数据库文件。 该文件将在第一次自动复制到应用程序的 Documents 文件夹中。
DAOFactory
它用于动态创建 RuntimeDAO
对象或 DAOBase
类的后代。
DAOFactory *factory = [DAOFactory factory];
DAO *dao = [factory createRuntimeDAO:@"EntityName"];
您可以扩展 DAOFactory
并为您的自定义 DAO 实现工厂方法。
DAOFactory *factory = [DAOFactory factory];
MyCustomDAO *dao = (MyCustomDAO*)[factory newDAO:MyCustomDAO.class];
...
[dao release];
DAO
带有其协议的 DAO
类定义了用于托管对象操作的通用方法。 每个 DAO 仅服务于一个托管对象类型,这意味着它仅为这种特定的托管对象类型定义。 如果您不需要为数据对象操作实现自定义方法,则可以使用 RuntimeDAO
类,这是一个简单的 DAO 实现。
如果您需要或想要封装与核心数据对象操作相关的业务逻辑(带有扩展功能的 CRUD),我们建议您在自定义 DAO 中实现它。
这是一个 DAO 方法声明的示例
// returns all managed objects id
-(NSArray*)findAllId;
// returns all managed objects
-(NSArray*)findAll;
// returns all managed objects - with pagination
-(NSArray*)findAll:(NSUInteger)fetchOffset limit:(NSUInteger)limit;
// returns all managed objects id - with pagination
-(NSArray*)findAllId:(CDSearchCriteria*)criteria;
// returns all managed objects based on given criteria
-(NSArray*)findAll:(CDSearchCriteria*)criteria;
// returns all managed objects based on given criteria - with pagination
-(NSArray*)findAll:(CDSearchCriteria*)criteria
fetchOffset:(NSUInteger)fetchOffset limit:(NSUInteger)limit;
// returns all managed objects count
-(NSUInteger)count;
// returns all managed objects based on given criteria
-(NSUInteger)count:(CDSearchCriteria*)criteria;
// inserts new managed object and returns it to caller
-(NSManagedObject*)insertNewObject;
// deletes given managed object
-(void)deleteObject:(NSManagedObject*)object;
// resturns managed object with given id
-(NSManagedObject*)findObjectById:(NSManagedObjectID*)objectID;
// if flag is YES, merges an object with the state
// of the object available in the persistent store coordinator;
// if flag is NO, simply refaults an object without merging (which also causes other
// related managed objects to be released, so you can use this method
// to trim the portion of your object graph you want to hold in memory)
- (void)refreshObject:(NSManagedObject *)object mergeChanges:(BOOL)flag;
Cocoa 谓词 - 查询
用于托管对象查询的基类是 CDSearchCriteria
类,它只是 'filters','orders' 和 'projections' 的持有者。 所有适用于标准的类都包含用于实例化所需标准对象的工厂方法。
过滤器。
过滤器用作谓词,用于限制查询结果。
过滤器由 CDFilter
类(及其子类)表示。 此版本不支持任何 Core Data 谓词(例如“beginswith”,“ANY”,“ALL”运算符...)。
CDSearchCriteria *criteria = [CDSearchCriteria criteria];
[criteria addFilter:[CDFilter like:@"stringProperty1" value:@"abc*" caseSensitive:NO]];
[criteria addFilter:[CDFilter isNotNull:@"timeStamp"]];
订单
顺序用于对查询结果进行排序。 顺序由 CDOrder
类表示,该类非常简单。
CDSearchCriteria *criteria = [CDSearchCriteria criteria];
[criteria addOrder:[CDOrder ascendingOrder:@"timeStamp"]];
投影
投影用于获取非托管对象的整个图形,而仅是属性或计算值。 投影由 CDProjection
类表示。
CDSearchCriteria *criteria = [CDSearchCriteria criteria];
[criteria addProjection:[CDProjection createWithProperty:@"timeStamp"]];
成功查询后,投影结果值存储在数组中,每个结果行对应于字典中的一个条目。 投影结果的简单值存储在字典中,键是属性名称。
函数的投影以以下形式存储在字典中,键是复合键
@"function name:property name"
例如
@"min:property1"
函数
函数用于过滤器或投影中,并表示托管对象属性值的某些转换。 在当前版本中,它们是 'min','max','sum' 和 'lower'。
CDSearchCriteria *criteria = [CDSearchCriteria criteria];
[criteria addFilter:[CDFilter isNotNull:@"timeStamp"]];
[criteria addProjection:[CDProjection createWithFunction:[CDFunction
sum:@"doubleValueProperty" resultType:NSDateAttributeType]]];
NSFetchedResultsController
DAO 协议包含用于基于给定标准轻松创建 NSFetchedResultsController
的方法
CDSearchCriteria *criteria = [CDSearchCriteria criteria];
...
DAO *dao = [[DAOFactory factory] createRuntimeDAO:@"Event"];
NSFetchedResultsController *fetchedResultsController =
[dao newFetchedResultsController:criteria sectionNameKeyPath:nil cacheName:@"Root"];
关注点
此最新版本中未包含任何文档。 无论如何,源代码是不言自明的,并且总共只有几百行。
如有任何问题,欢迎与我联系。
历史
- 2009 年夏季:初始版本。