从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去实现自己的业务逻辑吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容