注册 登录
主题 : SQLite Persistent Objects简化你的数据持久化工作
级别: 精灵王

状态: 连续签到 - [8天]
UID: 1185
精华: 7
发帖: 145
可可豆: 25657 CB
威望: 25623 点
在线时间: 5079(时)
注册时间: 2008-11-01
最后登录: 2017-08-03
0 楼:  发表于: 2009-04-15 11:10    发自: Web Page

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

管理提醒: 本帖被 gagaga 设置为精华(2009-09-01)
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/
旺财勇士
级别: 版主

状态: 连续签到 - [144天]
UID: 491
精华: 6
发帖: 1766
可可豆: 112205 CB
威望: 112852 点
在线时间: 8537(时)
注册时间: 2008-08-19
最后登录: 2019-02-28
1 楼:  发表于: 2009-04-15 11:17    发自: Web Page
沙發占座, 這篇好文絕對在本站出現過...
待小僧整理時把原文挖出來...

引用
引用楼主dboylx于2009-04-15 11:10 AM发表的 SQLite Persistent Objects简化你的数据持久化工作 :
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的查询只需要修改你所关注的部分,让我们可以化复杂为简单,化简单为更简单。

.......

 Developer
------------------------------------------------------------
Η αγάπη ποτέ δεν αποτυγχάνει.
愛是永不止息。
Love never fails.

    --《圣经.新约》哥林多前书第13章
级别: 精灵王

状态: 连续签到 - [8天]
UID: 1185
精华: 7
发帖: 145
可可豆: 25657 CB
威望: 25623 点
在线时间: 5079(时)
注册时间: 2008-11-01
最后登录: 2017-08-03
2 楼:  发表于: 2009-04-15 11:30    发自: Web Page
是我在iPhoneSide首发的~现在转发到cocoachina上  
旺财勇士
级别: 骑士
UID: 2380
精华: 0
发帖: 22
可可豆: 2966 CB
威望: 2966 点
在线时间: 338(时)
注册时间: 2009-02-24
最后登录: 2016-12-29
3 楼:  发表于: 2009-04-15 12:02    发自: Web Page
又见对java的歧视。。。。。。
现在java各种框架多了去了,使用起来也没有那么复杂,而且很多都是开源的,
在此表示个人对LZ的B4.
级别: 风云使者

UID: 191
精华: 5
发帖: 424
可可豆: 74253 CB
威望: 74253 点
在线时间: 2874(时)
注册时间: 2008-06-27
最后登录: 2015-04-16
4 楼:  发表于: 2009-04-15 12:35    发自: Web Page
又见对java的歧视,LZ握手
java不是坏东西,但是很多java工程师张口设计闭口模式,是非常让人讨厌的。很多人都喜欢把简单问题复杂化,但是以java工程师为甚。希望LS不是这种人。
级别: 精灵王

UID: 4379
精华: 0
发帖: 323
可可豆: 12279 CB
威望: 12270 点
在线时间: 2131(时)
注册时间: 2009-04-09
最后登录: 2016-12-05
5 楼:  发表于: 2009-04-15 13:02    发自: Web Page
哈哈,喜欢activerecords, 用objective c 操作 sqlite3  头都大了。
级别: 精灵王

状态: 连续签到 - [8天]
UID: 1185
精华: 7
发帖: 145
可可豆: 25657 CB
威望: 25623 点
在线时间: 5079(时)
注册时间: 2008-11-01
最后登录: 2017-08-03
6 楼:  发表于: 2009-04-15 13:21    发自: Web Page
我已经把它做到项目里了,一个读书的软件,很成功 !

比它的C方便,而且是Objective-C的接口~用起来更顺手
旺财勇士
级别: 骑士
UID: 2380
精华: 0
发帖: 22
可可豆: 2966 CB
威望: 2966 点
在线时间: 338(时)
注册时间: 2009-02-24
最后登录: 2016-12-29
7 楼:  发表于: 2009-04-15 13:42    发自: Web Page
引用
引用第4楼superarts于2009-04-15 12:35发表的  :
又见对java的歧视,LZ握手
java不是坏东西,但是很多java工程师张口设计闭口模式,是非常让人讨厌的。很多人都喜欢把简单问题复杂化,但是以java工程师为甚。希望LS不是这种人。

好吧,既然说起了,就要谈谈。说说道理。
说java工程师张口设计闭口模式,- -你见到几个我不清楚,不过可能你运气不好见到的特别多,不过这不是没有理由的。
你让java工程师不谈设计模式什么的,就好像你让c工程师不谈内存操作和指针一样。
现在j2ee主要在工业和大型网站还有OA这块,要知道,这些东西,不是搞一次性开发的。
这样一些东西,往往要考虑到以后很多的维护和升级,扩展等等,这就不得不在最初得设计得时候,需要考虑到方方面面,那当然就要涉及到设计和模式得问题。
所以有些东西并不只是单纯得把简单得问题复杂化。好比你规划个小区,如果要考虑到学校医院,还要为以后得公共交通预先规划和留出空间,这在当前来看,可能是复杂不讨好得,但是对以后来说呢?

个人并不对c,java或者是其它软件报有特别得喜欢或者是讨厌的感情,但是大家都是同宗同源,我就不明白为什么国内很多人歧视java以至于歧视java程序员,这是没有理由的,也是在国外所没有的。
级别: 精灵王

状态: 连续签到 - [8天]
UID: 1185
精华: 7
发帖: 145
可可豆: 25657 CB
威望: 25623 点
在线时间: 5079(时)
注册时间: 2008-11-01
最后登录: 2017-08-03
8 楼:  发表于: 2009-04-15 14:04    发自: Web Page
我自己就是个JAVA程序员,发文搞乐只是为了自嘲~
旺财勇士
级别: 精灵王

UID: 18
精华: 2
发帖: 857
可可豆: 3880 CB
威望: 3880 点
在线时间: 359(时)
注册时间: 2008-04-03
最后登录: 2011-11-18
9 楼:  发表于: 2009-04-15 18:56    发自: Web Page
3.0有CoreData,应该是更方便的...
There is no place like 127.0.0.1

CocoaChina社区转载内容已尽可能注明出处,如未能核实来源或转发内容图片有权利瑕疵的,请及时联系社区进行修改或删除【联系方式QQ : 3442093904 邮箱:support@cocoachina.com】文章内容为作者独立观点,不代表CocoaChina社区立场。版权归原作者所有,如申请授权请联系作者,因文章侵权CocoaChina社区不承担任何法律及连带责任。

描述
快速回复

关注本帖(如果有新回复会站内信通知您)

发帖、回帖都会得到可观的积分奖励。查看论坛积分规则

按"Ctrl+Enter"直接提交
    顶部