iOS如何读取.db文件

做项目的过程中经常会遇到处理一些比较大而且比较固定的数据,比如汽车的品牌,型号,系列,或者是地区列表,这些数据都有一个共同的特点,那就是数据基本上不会发生太大的变化,而且数据量比较大,如果从请求服务器,会非常慢,性能非常差,所以就需要将其放到本地处理,一般我们会将地区制作成plist文件读取,但是对于汽车品牌数据量大的数据,这种做法就不适用了。这里提供一种比较方便的方法,就是找一个.db文件的资源,然后将其导入项目,使用FMDB对其进行操作。

SQLite是一个轻量级的关系数据库,iOS本身也是支持SQLite的,但是使用时非常不便,于是就出现了FMDB开源库,FMDB实际上是对SQLite API进行了进一步的封装,使用更加便捷,代码也比较清晰。在使用FMDB之前,首先要导入FMDB库,相信大家都已经会导第三方库了,所以在这里就不再赘述导库的过程,直接说说如何使用FMDB吧。

首先我们来认识一下FMDB中比较重要的三个类
1.FMDatabase:是一个提供 SQLite 数据库的类,用于执行 SQL 语句。
2.FMResultSet:用在 FMDatabase 中执行查询的结果的类。
3.FMDatabaseQueue:在多线程下查询和更新数据库用到的类。

然后就是对数据库的相应的操作了,在对数据库操作之前,先给大家分享一个链接,便于随时查询SQLite语句,SQLite语句学习链接,好了,废话不多说,接下来就是对数据库的操作了。

对已经存在的数据库的操作

获取数据库的路径

NSString *path = [[NSBundle mainBundle] pathForResource:@"Vehicle_DICT (1)" ofType:@"db"];

创建执行SQLite数据库的类

FMDatabase *dataBase = [FMDatabase databaseWithPath:path];

打开数据库

[dataBase open];

执行查询操作

FMResultSet *result = [dataBase executeQuery:@"select distinct DVN_BRAND, DVN_BRAND_LOGO, DVN_BRAND_ENGLISH from DICT_VEHICLE_NEW order by DVN_BRAND_ENGLISH ASC;"];
     while ([result next]) {
        VehicledModel *model = [[VehicledModel alloc] init];
        model.DVN_BRAND = [result objectForColumnName:@"DVN_BRAND"];
        model.DVN_BRAND_ENGLISH = [result objectForColumnName:@"DVN_BRAND_ENGLISH"];
        NSString *logoImage = [[result objectForColumnName:@"DVN_BRAND_LOGO"] stringByReplacingOccurrencesOfString:@"/Content/Images/carbrand/" withString:@""];
        model.DVN_BRAND_LOGO = logoImage;
        [self.dataSource addObject:model];
        
    }

FMDB提供了如下几种方法来获取不同类型的数据

intForColumn:
longForColumn:
longLongIntForColumn:
boolForColumn:
doubleForColumn:
stringForColumn:
dateForColumn:
dataForColumn:
dataNoCopyForColumn:
UTF8StringForColumnIndex:
objectForColumn:

通常我们并不需要关闭FMResultSet,因为FMResultSet会随着相关数据库的关闭而自动关闭。
执行更新语句 SQLite更新语句

 [dataBase executeUpdate:@"update  dict_vehicle_new set dvn_brand = '凯瑞', dvn_brand_english = 'K'"];

执行插入语句SQLite插入语句

//1.executeUpdate:不确定的参数用?来占位(后面参数必须是oc对象,;代表语句结束)
 [dataBase executeUpdate:@“INSERT INTO dict_vehicle_new (dvn_brand, dvn_brand_english) VALUES (?,?);”,'宝马','B'];
 //2.executeUpdateWithForamat:不确定的参数用%@,%d等来占位 (参数为原始数据类型,执行语句不区分大小写)
 [dataBase executeUpdateWithForamat:@“insert into dict_vehicle_new (dvn_brand, dvn_brand_english) values (%@,%@);”,'宝马','B]
//3.参数是数组的使用方式
 [dataBase executeUpdate:@“INSERT INTO     
 dict_vehicle_new(dvn_brand, dvn_brand_english) VALUES  (?,?);”withArgumentsInArray:@['宝马','B']];

执行删除语句SQLite删除语句

 [dataBase executeUpdate:@“delete from dict_vehicle_new where dvn_brand = ?;”,'宝马'];

**FMDatabaseQueue **
FMDatabase这个类线程是不安全的,如果在多个线程中同时使用一个FMDatabase实例,会造成数据混乱等问题
为了保证线程安全,FMDB提供方便便捷的FMDatabaseQueue
FMDatabaseQueue 的创建

NSString *path = [[NSBundle mainBundle] pathForResource:@"Vehicle_DICT (1)" ofType:@"db"];
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path];

简单使用

[queue inDatabase:^(FMDatabase *db) { [db executeUpdate:@"INSERT INTO dict_vehicle_new(dvn_brand) VALUES (?)", @"宝马"]; 
 [db executeUpdate:@"INSERT INTO dict_vehicle_new(dvn_brand) VALUES (?)", @"保时捷"]; 
 [db executeUpdate:@"INSERT INTO dict_vehicle_new(dvn_brand) VALUES (?)", @"福特"]; 
 FMResultSet *rs = [db executeQuery:@"select * from dict_vehicle_new"]; 
 while ([rs next]) { 
     // … 
}
 }];

使用事物

[queue inTransaction:^(FMDatabase *db, BOOL *rollback) { 
db executeUpdate:@"INSERT INTO dict_vehicle_new(dvn_brand) VALUES (?)", @"宝马"]; 
 [db executeUpdate:@"INSERT INTO dict_vehicle_new(dvn_brand) VALUES (?)", @"保时捷"]; 
 [db executeUpdate:@"INSERT INTO dict_vehicle_new(dvn_brand) VALUES (?)", @"福特"]; 
 FMResultSet *rs = [db executeQuery:@"select * from dict_vehicle_new"]; 
 while ([rs next]) { 
     // … 
}
  }];

工具

为了查看sqlite中的数据,一个好的图形化数据库的管理工具是必不可少的,起初我使用的是SQLPro for SQLite Read-Only这个工具,但是后来发现这个工具是只读的,即只能执行查询操作,并不能进行增,删,更新操作,经同事推荐,现在使用DB Browser for Sqlite,这个工具能够实现增,删,改,查,使用也非常方便,如下图所示:


屏幕快照 2017-04-23 下午12.09.28.png

代码示例

我写了一个简单的demo,读取数据库汽车的品牌,型号,系列的例子,demo地址,如果有任何问题,可以私聊。如果哪里写的有问题,欢迎大神指正,小弟将不甚感激.

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

推荐阅读更多精彩内容