前言
做專案的過程中經常會遇到處理一些比較大而且比較固定的資料,比如汽車的品牌,型號,系列,或者是地區列表,這些資料都有一個共同的特點,那就是資料基本上不會發生太大的變化,而且資料量比較大,如果從請求伺服器,會非常慢,效能非常差,所以就需要將其放到本地處理,一般我們會將地區製作成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,這個工具能夠實現增,刪,改,查,使用也非常方便,如下圖所示:

程式碼示例
我寫了一個簡單的demo,讀取資料庫汽車的品牌,型號,系列的例子,demo地址,如果有任何問題,可以私聊。如果哪裡寫的有問題,歡迎大神指正,小弟將不甚感激.