从J2EE到IOS,反向学习IOS“数据库”
JAVA,从客户端到服务器端方向看,JAVA开发服务器端需要做的事情:1.接收数据 2.组织数据 3.调用逻辑层接口存储数据 4.反馈结果。
IOS ,从服务器端到客户端方向看, IOS开发客户端需要做的事情:1.接收数据 2.组织数据 3.调用逻辑层接口 4.展示数据。
用户:从手机到人, 人需要做的事情:1.接收数据(比如打开简书应用获取数据) 2.组织数据(分类关注应用) 3.调用逻辑层接口(打开一片文章思考内容) 4.存储数据(记忆部分)。
这样类比来看,我们与别人交换数据,所做的事情过程都是相似的,JAVA做的事情,IOS也都要做一遍,所以我的学习路线是从数据为圆心,由内到外反向的学习IOS之路,入门就比较快一些。
先说数据存储,服务器端存储方式多种多样,大体分为内存存储和硬盘存储,这都归功于计算机组成就是这样的,我们去电脑城攒机器,张口就来的几要素CPU,内存,硬盘,显卡,网卡。程序的代码就在这里面转来转去,驱动着这些元素的数据交换,所以所存储的模式肯定逃不出内存和硬盘去。映射到编程中的概念就是内存缓存和持久化缓存。JAVA服务器端流行的框架hibernate正是SSH中的H君,因为想要对比来形容一下IOS,所以这里不解释hibernate细节了,提到的名词度娘都能找到,谷歌就更别说了,简单说,它用ORMapping的方式封装了JDBC,用面向对象的思维在操作数据库。
ORMapping用对象和表的关系形容,就是类名对应表名,对象的一个属性对应表中的一列,一个对象对应表的一行数据,既然服务器有hibernate,我在初学OC的时候想,那IOS都用什么存储呢,通过度娘了解到了几种手机端存储数据库的方式 :首先手机端的数据库大多用sqlite存储数据,特点就是轻量简单,我想,你数据库再轻量简单,既然是关系型数据库,基本的操作也都不能少吧,ANSI SQL规范你得遵守吧,先不想IOS的sqlite的API怎么写,先回想一下JDBC数据库操作的的过程,JDBC可是JAVA程序员面试时候必聊的内容哦,加载驱动->连接库->打开库->创建Statement->根据sql执行语句->ResultSet接收结果->while result has next 方式去解析每一行数据->关闭结果集->关闭数据库。这个时候再去搜一下ios sqlite的关键字,去看里面文章的几个名词:
sqlite3_open() //打开数据库
sqlite3_prepare()//是类似JAVA的PreparedStatement,准备语句对象
sqlite3_stmt //stmt 也能猜到是PreparedStatement的缩写了
sqlite3_step() //执行查询语句
sqlite3_column()//结果的列信息
sqlite3_finalize()//析构,删除编译后的statement
sqlite3_close() //关闭库
然后继续搜到了一个简单的操作库的过程,地址是这里http://blog.sina.com.cn/s/blog_bf9843bf0101g043.html
对比一下JDBC的写法,理解起来容易多了。
//获取数据库文件路径
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
self.databaseFilePath = [documentsDirectory stringByAppendingPathComponent:kDatabaseName];
注: 取沙盒document文件夹下的数据库的路径,这里想说的是,看起来三行很多,第一眼看到我就想,一个个的都是啥啊,其实,这种写法算是固定写法,所以固定写法不用记忆,用的时候搜“IOS取沙盒路径写法”之类的关键字都能找到吧,找到了时候封装一个方法就用去了,在初学的时候想快速做出东西来完成任务,可不能陷入一行行抠语法的思维里,知道我能通过一个固定写法拿到一个路径即可,JAVA也是一样的,File操作的写法是固定的,当了解java的IO全貌后,有时间再回来看File的流栈就好理解了,再去抠细节作为知识点的补充去学,包括后面的数据库操作,都是固定写法,变的只是sql语句和结果集,我们目的是要最少的时间完成工作任务,看到产品展示出的结果,产品都能迭代,学习也能迭代。
//以IOS的方式打开数据库,固定写法!贴过来。
sqlite3 *database;
if (sqlite3_open([self.databaseFilePath UTF8String] , &database) != SQLITE_OK) {
sqlite3_close(database);
//创建数据库表,学JAVA的SQL肯定要学习的。
NSString *createSQL = @"CREATE TABLE IF NOT EXISTS FIELDS (TAG INTEGER PRIMARY KEY, FIELD_DATA TEXT);";
char *errorMsg;
if (sqlite3_exec(database, [createSQL UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) {
sqlite3_close(database);
}
//执行查询
NSString *query = @"SELECT TAG, FIELD_DATA FROM FIELDS ORDER BY TAG";
sqlite3_stmt *statement;
if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) {
while (sqlite3_step(statement) == SQLITE_ROW) {
int tag = sqlite3_column_int(statement, 0);
char *rowData = (char *)sqlite3_column_text(statement, 1);
}
sqlite3_finalize(statement);
}
//关闭数据库
sqlite3_close(database);
在搜索sqlite的时候,又发现了大家都推荐的FMDB框架,看一下用法,更加像JDBC,命名也比较好看,所以压根就没用sqlite,直接FMDB了,写起来方便,用的时候架子搭上,写熟悉的SQL就是了。这里顺便说一下我对第三方开源框架的想法,我接触过一些同事都喜欢自己去造轮子,什么东西都希望自己亲自写,觉得这样能够学习技术,提升自己的能力。理由是第三方有很多东西不稳定,维护起来困难,不如自己写痛快。但是我的理解是用成熟的第三方开源框架不仅能事半功倍,还能更加迅速的学到别人的先进思想,而且框架用的人越多,文档越全面,出现问题解决的途径越多。想象一下,自己造的轮子上线后,在自己工作交接给下一任的时候,就知道别人会多么痛苦了,那时候一定会面临交接仓促,无文档,只有上帝和你知道这段代码中隐藏的的逻辑。当在解决成熟框架问题的时候阅读源码后提升的能力不比自己完全写一遍提升的少。说到这里,FMDB写法是这样的:
1.第一步连接数据库
FMDatabase *db = [FMDatabase databaseWithPath:PATH];
2.第二步打开数据库
if(![db open]) return;
3.第三步执行更新
[db executeUpdate:@"CREATE TABLE PersonList (Name text, Age integer, Sex integer, Phone text, Address text, Photo blob)"];
3.查询是这么写的
FMResultSet *rs = [db executeQuery:@"SELECT Name, Age, FROM PersonList where id = ?", 19999];
while([rs next]) {
NSString *name = [rs stringForColumn:@"Name"];
int age = [rs intForColumn:@"Age"];
}
[rs close];
[db close];
写过JDBC的都能看明白这些吧,理解起来很顺,迅速搭好框架,剩下的时间去组织复杂的SQL去实现自己的业务逻辑吧。