现在的位置: 首页 > 综合 > 正文

SQLite Persistent Objects简化你的数据持久化工作

2014年09月05日 ⁄ 综合 ⁄ 共 2246字 ⁄ 字号 评论关闭

原文链接:http://blog.csdn.net/dboylx/archive/2009/03/24/4019402.aspx

 

iPhone开发包中有对SQLite的类库支持,但它是C接口,而且API麻烦的要死。当然,你可能会做些封装使它更好用些。但如果我告诉你这里
有个更好用的ORM,还是ActiveRecord的,你会不会高兴的发疯呢?它就是“SQLite Persistent
Objects”,一款Objective-C实现的ActiveRecord。

Rails社区红透半边天的ORM模式。简单就是它最大特色,并不像某些ORM一味执着于纯OO的高贵血统,不计成本的实现华丽且优雅的ORM。在
Rails社区里流传着这样一句话:“除了JAVA社区的工程师,很少有人拿着一千页的《轻松学XXX》会觉得很高兴” (^_^) 。当然,我们的
ActiveRecord也不缺传统ORM实现:事务,类型转换,校验,表连接,对象子父关系。但它是轻量级的,除此以外更允许你直接用SQL。
ActiveRecord已经把SQL按动词切开(像select, from , joins , where , group by , order
by),真对一个Model的查询只需要修改你所关注的部分,让我们可以化复杂为简单,化简单为更简单。

在理想的世界里,我们所有Objective-C数据对象都知道如何自己保存与加载数据。我们调用了对象“save”方法后它就已经被保存起来,当我们需要加载数据时,只是简单的调用类方法来获取想要的数据,复杂查询也不排斥直接用SQL(但返回结果依然是对象)。

做了什么?

创建一个Objective-C类,它知道怎样把数据持久化到SQLite数据库上。不仅如此,它还隐藏了所有的实现细节:甚至不需要创建数据库与
表,或其它任何额外工作。类只需要继承自“SQLitePersistentObject”,然后,添加您想要持久化的Objective-C 2.0属
性。当这个类被实例化后,调用”save”方法,会自动保存到数据库中。

它怎么工作的?

每一个“SQLitePersistentObject”的子类都会拥有数据库中对应的一张表。每一个属性(不包括集合类型,
像,NSDictionary,NSArray,NSSet或这些类的可变类型)都会持久化到表中相应字段中。属性中如果含有指针对象
是”SQLitePersistentObject”实例,也将会在关联表里新添条记录。

所有的属性都会保存么?

答案是否定的,当前并不支持c-string,void pointer,
strutct 或 union。但所有的数字(int,float等)都会保存在应的字段上。任何实现“NSCoding”(类似JAVA中的序列化接
口,但它需要自己实现,而JAVA只是标志型接口)接口的对象都可以保存在数据库中。已经支持的类
型:NSDate,NSString,NSData,NSMutableData,NSNumber与NSObject。

那些没有持久化支持的类,会用NSObject的持久机制,它会用”NSKeyedArchiver”把它归档为BLOB并保存在数据库里。

怎样使用?

把本项目的所有文档添加到你的项目中,添加”libsqlite3.dylib”库,接着声名你的模型类。

#import <foundation/foundation.h>

#import “SQLitePersistentObject.h”

@interface PersistablePerson : SQLitePersistentObject
 {

NSString *lastName;

NSString *firstName;

}

@property (nonatomic, retain) NSString * lastName;

@property (nonatomic, retain) NSString * firstName;

@end

生成类文件后,创建实例:

PersistablePerson *person = [[PersistablePerson alloc] init];

person.firstName = @”Joe”;

person.lastName = @”Smith”;

调用”save”方法,保存到数据库中:

[person save];

加载表中的数据也相当的简单。任何一个”Persistable”类都有多个提供查询的类方法。例如,你可以查询所有姓“Smith”的人:

NSArray *people = [PersistablePerson findByLastName
:@"Smith"]

或者更灵活的使用SQL查询条件:

PeristablePerson *joeSmith = [PersistablePerson findFirstByCriteria
:@"WHERE last_name = 'Smith' AND first_name = 'Joe'];

注意大写字母区分的情况用下划线代替(ActiveRecord的惯例)。”findByCriteria:”返回一个NSArray数组,”findFirstByCriteria:”返回一个对象。

更多资料:

http://code.google.com/p/pldatabase/

翻译自:

http://iphonedevelopment.blogspot.com/2008/08/sqlite-persistent-objects.html

抱歉!评论已关闭.