iOS如何讀取.db檔案

coder小鵬發表於2018-01-26

前言

做專案的過程中經常會遇到處理一些比較大而且比較固定的資料,比如汽車的品牌,型號,系列,或者是地區列表,這些資料都有一個共同的特點,那就是資料基本上不會發生太大的變化,而且資料量比較大,如果從請求伺服器,會非常慢,效能非常差,所以就需要將其放到本地處理,一般我們會將地區製作成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地址,如果有任何問題,可以私聊。如果哪裡寫的有問題,歡迎大神指正,小弟將不甚感激.

相關文章