原文链接: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-C2.0属 性。当这个类被实例化后,调用”save”方法,会自动保存到数据库中。
它怎么工作的?
每一个“SQLitePersistentObject”的子类都会拥有数据库中对应的一张表。每一个属性(不包括集合类型, 像,NSDictionary,NSArray,NSSet或这些类的可变类型)都会持久化到表中相应字段中。属性中如果含有指针对象 是”SQLitePersistentObject”实例,也将会在关联表里新添条记录。
所有的属性都会保存么?
答案是否定的,当前并不支持c-string,voidpointer, 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”
@interfacePersistablePerson :SQLitePersistentObject {
NSString*lastName;
NSString*firstName;
}
@property(nonatomic, retain)NSString* lastName;
@property(nonatomic, retain)NSString* firstName;
@end
生成类文件后,创建实例:
PersistablePerson *person = [[PersistablePersonalloc]init];
person.firstName =@”Joe”;
person.lastName =@”Smith”;
调用”save”方法,保存到数据库中:
[personsave];
加载表中的数据也相当的简单。任何一个”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