做項目的過程中經(jīng)常會遇到處理一些比較大而且比較固定的數(shù)據(jù)锭弊,比如汽車的品牌,型號柜裸,系列缕陕,或者是地區(qū)列表,這些數(shù)據(jù)都有一個共同的特點疙挺,那就是數(shù)據(jù)基本上不會發(fā)生太大的變化扛邑,而且數(shù)據(jù)量比較大,如果從請求服務(wù)器铐然,會非常慢蔬崩,性能非常差,所以就需要將其放到本地處理搀暑,一般我們會將地區(qū)制作成plist文件讀取沥阳,但是對于汽車品牌數(shù)據(jù)量大的數(shù)據(jù),這種做法就不適用了自点。這里提供一種比較方便的方法桐罕,就是找一個.db文件的資源,然后將其導(dǎo)入項目桂敛,使用FMDB對其進行操作功炮。
SQLite是一個輕量級的關(guān)系數(shù)據(jù)庫,iOS本身也是支持SQLite的术唬,但是使用時非常不便薪伏,于是就出現(xiàn)了FMDB開源庫,F(xiàn)MDB實際上是對SQLite API進行了進一步的封裝粗仓,使用更加便捷嫁怀,代碼也比較清晰。在使用FMDB之前潦牛,首先要導(dǎo)入FMDB庫眶掌,相信大家都已經(jīng)會導(dǎo)第三方庫了挡育,所以在這里就不再贅述導(dǎo)庫的過程巴碗,直接說說如何使用FMDB吧。
首先我們來認識一下FMDB中比較重要的三個類
1.FMDatabase
:是一個提供 SQLite 數(shù)據(jù)庫的類即寒,用于執(zhí)行 SQL 語句橡淆。
2.FMResultSet
:用在 FMDatabase 中執(zhí)行查詢的結(jié)果的類。
3.FMDatabaseQueue
:在多線程下查詢和更新數(shù)據(jù)庫用到的類母赵。
然后就是對數(shù)據(jù)庫的相應(yīng)的操作了逸爵,在對數(shù)據(jù)庫操作之前,先給大家分享一個鏈接凹嘲,便于隨時查詢SQLite語句师倔,SQLite語句學(xué)習(xí)鏈接,好了周蹭,廢話不多說趋艘,接下來就是對數(shù)據(jù)庫的操作了疲恢。
對已經(jīng)存在的數(shù)據(jù)庫的操作
獲取數(shù)據(jù)庫的路徑
NSString *path = [[NSBundle mainBundle] pathForResource:@"Vehicle_DICT (1)" ofType:@"db"];
創(chuàng)建執(zhí)行SQLite數(shù)據(jù)庫的類
FMDatabase *dataBase = [FMDatabase databaseWithPath:path];
打開數(shù)據(jù)庫
[dataBase open];
執(zhí)行查詢操作
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提供了如下幾種方法來獲取不同類型的數(shù)據(jù)
intForColumn:
longForColumn:
longLongIntForColumn:
boolForColumn:
doubleForColumn:
stringForColumn:
dateForColumn:
dataForColumn:
dataNoCopyForColumn:
UTF8StringForColumnIndex:
objectForColumn:
通常我們并不需要關(guān)閉FMResultSet
,因為FMResultSet
會隨著相關(guān)數(shù)據(jù)庫的關(guān)閉而自動關(guān)閉。
執(zhí)行更新語句 SQLite更新語句
[dataBase executeUpdate:@"update dict_vehicle_new set dvn_brand = '凱瑞', dvn_brand_english = 'K'"];
執(zhí)行插入語句SQLite插入語句
//1.executeUpdate:不確定的參數(shù)用瓷胧?來占位(后面參數(shù)必須是oc對象显拳,;代表語句結(jié)束)
[dataBase executeUpdate:@“INSERT INTO dict_vehicle_new (dvn_brand, dvn_brand_english) VALUES (?,?);”,'寶馬','B'];
//2.executeUpdateWithForamat:不確定的參數(shù)用%@搓萧,%d等來占位 (參數(shù)為原始數(shù)據(jù)類型杂数,執(zhí)行語句不區(qū)分大小寫)
[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í)行刪除語句SQLite刪除語句
[dataBase executeUpdate:@“delete from dict_vehicle_new where dvn_brand = ?;”,'寶馬'];
**FMDatabaseQueue **
FMDatabase
這個類線程是不安全的,如果在多個線程中同時使用一個FMDatabase
實例瘸洛,會造成數(shù)據(jù)混亂等問題
為了保證線程安全揍移,F(xiàn)MDB提供方便便捷的FMDatabaseQueue
FMDatabaseQueue 的創(chuàng)建
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中的數(shù)據(jù),一個好的圖形化數(shù)據(jù)庫的管理工具是必不可少的反肋,起初我使用的是SQLPro for SQLite Read-Only這個工具羊精,但是后來發(fā)現(xiàn)這個工具是只讀的,即只能執(zhí)行查詢操作囚玫,并不能進行增喧锦,刪,更新操作抓督,經(jīng)同事推薦燃少,現(xiàn)在使用DB Browser for Sqlite,這個工具能夠?qū)崿F(xiàn)增,刪铃在,改阵具,查,使用也非常方便定铜,如下圖所示:
代碼示例
我寫了一個簡單的demo,讀取數(shù)據(jù)庫汽車的品牌阳液,型號,系列的例子揣炕,demo地址,如果有任何問題帘皿,可以私聊。如果哪里寫的有問題畸陡,歡迎大神指正鹰溜,小弟將不甚感激.