iOS如何讀取.db文件

做項(xiàng)目的過(guò)程中經(jīng)常會(huì)遇到處理一些比較大而且比較固定的數(shù)據(jù),比如汽車(chē)的品牌,型號(hào),系列,或者是地區(qū)列表,這些數(shù)據(jù)都有一個(gè)共同的特點(diǎn),那就是數(shù)據(jù)基本上不會(huì)發(fā)生太大的變化,而且數(shù)據(jù)量比較大,如果從請(qǐng)求服務(wù)器,會(huì)非常慢,性能非常差,所以就需要將其放到本地處理,一般我們會(huì)將地區(qū)制作成plist文件讀取,但是對(duì)于汽車(chē)品牌數(shù)據(jù)量大的數(shù)據(jù),這種做法就不適用了。這里提供一種比較方便的方法,就是找一個(gè).db文件的資源,然后將其導(dǎo)入項(xiàng)目,使用FMDB對(duì)其進(jìn)行操作。

SQLite是一個(gè)輕量級(jí)的關(guān)系數(shù)據(jù)庫(kù),iOS本身也是支持SQLite的,但是使用時(shí)非常不便,于是就出現(xiàn)了FMDB開(kāi)源庫(kù),F(xiàn)MDB實(shí)際上是對(duì)SQLite API進(jìn)行了進(jìn)一步的封裝,使用更加便捷,代碼也比較清晰。在使用FMDB之前,首先要導(dǎo)入FMDB庫(kù),相信大家都已經(jīng)會(huì)導(dǎo)第三方庫(kù)了,所以在這里就不再贅述導(dǎo)庫(kù)的過(guò)程,直接說(shuō)說(shuō)如何使用FMDB吧。

首先我們來(lái)認(rèn)識(shí)一下FMDB中比較重要的三個(gè)類(lèi)
1.FMDatabase:是一個(gè)提供 SQLite 數(shù)據(jù)庫(kù)的類(lèi),用于執(zhí)行 SQL 語(yǔ)句。
2.FMResultSet:用在 FMDatabase 中執(zhí)行查詢(xún)的結(jié)果的類(lèi)。
3.FMDatabaseQueue:在多線程下查詢(xún)和更新數(shù)據(jù)庫(kù)用到的類(lèi)。

然后就是對(duì)數(shù)據(jù)庫(kù)的相應(yīng)的操作了,在對(duì)數(shù)據(jù)庫(kù)操作之前,先給大家分享一個(gè)鏈接,便于隨時(shí)查詢(xún)SQLite語(yǔ)句,SQLite語(yǔ)句學(xué)習(xí)鏈接,好了,廢話不多說(shuō),接下來(lái)就是對(duì)數(shù)據(jù)庫(kù)的操作了。

對(duì)已經(jīng)存在的數(shù)據(jù)庫(kù)的操作

獲取數(shù)據(jù)庫(kù)的路徑

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

創(chuàng)建執(zhí)行SQLite數(shù)據(jù)庫(kù)的類(lèi)

FMDatabase *dataBase = [FMDatabase databaseWithPath:path];

打開(kāi)數(shù)據(jù)庫(kù)

[dataBase open];

執(zhí)行查詢(xún)操作

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提供了如下幾種方法來(lái)獲取不同類(lèi)型的數(shù)據(jù)

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

通常我們并不需要關(guān)閉FMResultSet,因?yàn)?code>FMResultSet會(huì)隨著相關(guān)數(shù)據(jù)庫(kù)的關(guān)閉而自動(dòng)關(guān)閉。
執(zhí)行更新語(yǔ)句 SQLite更新語(yǔ)句

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

執(zhí)行插入語(yǔ)句SQLite插入語(yǔ)句

//1.executeUpdate:不確定的參數(shù)用?來(lái)占位(后面參數(shù)必須是oc對(duì)象,;代表語(yǔ)句結(jié)束)
 [dataBase executeUpdate:@“INSERT INTO dict_vehicle_new (dvn_brand, dvn_brand_english) VALUES (?,?);”,'寶馬','B'];
 //2.executeUpdateWithForamat:不確定的參數(shù)用%@,%d等來(lái)占位 (參數(shù)為原始數(shù)據(jù)類(lèi)型,執(zhí)行語(yǔ)句不區(qū)分大小寫(xiě))
 [dataBase executeUpdateWithForamat:@“insert into dict_vehicle_new (dvn_brand, dvn_brand_english) values (%@,%@);”,'寶馬','B]
//3.參數(shù)是數(shù)組的使用方式
 [dataBase executeUpdate:@“INSERT INTO     
 dict_vehicle_new(dvn_brand, dvn_brand_english) VALUES  (?,?);”withArgumentsInArray:@['寶馬','B']];

執(zhí)行刪除語(yǔ)句SQLite刪除語(yǔ)句

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

**FMDatabaseQueue **
FMDatabase這個(gè)類(lèi)線程是不安全的,如果在多個(gè)線程中同時(shí)使用一個(gè)FMDatabase實(shí)例,會(huì)造成數(shù)據(jù)混亂等問(wèn)題
為了保證線程安全,F(xiàn)MDB提供方便便捷的FMDatabaseQueue
FMDatabaseQueue 的創(chuàng)建

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

簡(jiǎn)單使用

[queue inDatabase:^(FMDatabase *db) { [db executeUpdate:@"INSERT INTO dict_vehicle_new(dvn_brand) VALUES (?)", @"寶馬"]; 
 [db executeUpdate:@"INSERT INTO dict_vehicle_new(dvn_brand) VALUES (?)", @"保時(shí)捷"]; 
 [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 (?)", @"保時(shí)捷"]; 
 [db executeUpdate:@"INSERT INTO dict_vehicle_new(dvn_brand) VALUES (?)", @"福特"]; 
 FMResultSet *rs = [db executeQuery:@"select * from dict_vehicle_new"]; 
 while ([rs next]) { 
     // … 
}
  }];

工具

為了查看sqlite中的數(shù)據(jù),一個(gè)好的圖形化數(shù)據(jù)庫(kù)的管理工具是必不可少的,起初我使用的是SQLPro for SQLite Read-Only這個(gè)工具,但是后來(lái)發(fā)現(xiàn)這個(gè)工具是只讀的,即只能執(zhí)行查詢(xún)操作,并不能進(jìn)行增,刪,更新操作,經(jīng)同事推薦,現(xiàn)在使用DB Browser for Sqlite,這個(gè)工具能夠?qū)崿F(xiàn)增,刪,改,查,使用也非常方便,如下圖所示:


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

代碼示例

我寫(xiě)了一個(gè)簡(jiǎn)單的demo,讀取數(shù)據(jù)庫(kù)汽車(chē)的品牌,型號(hào),系列的例子,demo地址,如果有任何問(wèn)題,可以私聊。如果哪里寫(xiě)的有問(wèn)題,歡迎大神指正,小弟將不甚感激.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容