65.9K
CodeProject 正在变化。 阅读更多。
Home

CoreData持久化框架

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2012年1月15日

BSD

3分钟阅读

viewsIcon

31534

downloadIcon

834

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 年夏季:初始版本。
© . All rights reserved.