正如我們前面所看到的,原生SQLite API在使用時(shí)還是比較麻煩的,于是,開(kāi)源社區(qū)就出現(xiàn)了一系列將SQLite API進(jìn)行封裝的庫(kù),其中FMDB的被大多數(shù)人所使用
FMDB和SQLite相比較,SQLite比較原始,操作比較復(fù)雜,使用的是C的函數(shù)對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,但是SQLite可控性更強(qiáng),并且能夠跨平臺(tái),F(xiàn)MDB只能在iOS開(kāi)發(fā)中使用
cocoapods導(dǎo)入第三方庫(kù)FMDB
pod 'FMDB'
參考【iOS】JSONModel的基本使用
FMDB簡(jiǎn)介
FMDB是iOS開(kāi)發(fā)中的一個(gè)輕量級(jí)第三方數(shù)據(jù)庫(kù)框架,它以OC
的方式封裝了SQLite
的C語(yǔ)言接口,省去了麻煩的C語(yǔ)言代碼,且更加面向?qū)ο?,操作方?/p>
FMDB一般涉及以下3個(gè)核心類:
- FMDatabase:此類的一個(gè)實(shí)例代表一個(gè)SQLite數(shù)據(jù)庫(kù),也有許多執(zhí)行SQL語(yǔ)句的方法
- FMResultSet(結(jié)果集):使用FMDatabase執(zhí)行SQLite查詢語(yǔ)句后的結(jié)果集
- FMDatabaseQueue(數(shù)據(jù)庫(kù)隊(duì)列):用于在多線程中執(zhí)行多個(gè)查詢或更新,它是線程安全的
FMDB基本使用
打開(kāi)數(shù)據(jù)庫(kù)
_dataBase = [FMDatabase databaseWithPath: @"/Users/Username/Desktop/CS/Xcode/FMDBTest/fmDb.sqlite"];
if (![_dataBase open]) {
NSLog(@"打開(kāi)數(shù)據(jù)庫(kù)失??!");
} else {
NSLog(@"%@", _dataBase.databasePath);
}
//其他代碼
//...
[_dataBase close];
//通常打開(kāi)操作完成后,需要調(diào)用close方法來(lái)關(guān)閉
- 當(dāng)
fmDb.sqlite
數(shù)據(jù)庫(kù)不存在時(shí),會(huì)自動(dòng)創(chuàng)建
- Path參數(shù)傳入空字符串
@""
,會(huì)在臨時(shí)目錄創(chuàng)建一個(gè)空數(shù)據(jù)庫(kù),F(xiàn)MDatabase連接關(guān)閉時(shí),數(shù)據(jù)庫(kù)文件也被刪除 - 傳入的參數(shù)是
nil
時(shí),會(huì)在內(nèi)存中創(chuàng)建一個(gè)臨時(shí)數(shù)據(jù)庫(kù),F(xiàn)MDatabase連接關(guān)閉時(shí),數(shù)據(jù)庫(kù)文件會(huì)被銷毀
執(zhí)行更新操作
與SQLite一樣,除查詢以外的所有操作,都稱為“更新”,包括create
、drop
、insert
、update
、delete
等
傳入的參數(shù)為SQLite語(yǔ)句字符串
...
表示可變數(shù)量的參數(shù)(變長(zhǎng)參數(shù)),可以根據(jù)需要將一些額外的參數(shù)傳遞給方法
這里以創(chuàng)建表、插入數(shù)據(jù)作為示例:
BOOL result = [_dataBase executeUpdate: @"CREATE TABLE IF NOT EXISTS t_Student(ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT NOT NULL, AGE INTEGER NOT NULL, SCORE REAL)"];
if (result) {
NSLog(@"創(chuàng)表成功");
//插入操作
for (int i = 0; i < 10; ++i) {
NSString* name = [NSString stringWithFormat: @"jaxon-%d", arc4random_uniform(100)];
//不確定的參數(shù)用?、?占位
[_dataBase executeUpdate: @"INSERT INTO t_student (name, age) VALUES (?, ?)", name, @(arc4random_uniform(40))];
//不確定的參數(shù)用%@、%d占位
//[_dataBase executeUpdateWithFormat: @"INSERT INTO t_student (name, age) VALUES (@%, %d)", name, @(arc4random_uniform(40))];
}
//刪除操作
//[_dataBase executeUpdate: @"DROP TABLE IF EXISTS t_student"];
} else {
NSLog(@"創(chuàng)表失敗");
}
執(zhí)行查詢操作
只管將SQL查詢語(yǔ)句傳進(jìn)去
FMResultSet* resultSet = [_dataBase executeQuery: @"SELECT * FROM t_student"];
// 遍歷結(jié)果集
while ([resultSet next]) {
int ID = [resultSet intForColumn: @"ID"];
NSString* name = [resultSet stringForColumn: @"NAME"];
int age = [resultSet intForColumn: @"AGE"];
NSLog(@"%d %@ %d", ID, name, age);
}
運(yùn)行結(jié)果:
可以看到插入操作也是成功的
數(shù)據(jù)參數(shù)
這里還有一些有關(guān)參數(shù)的小細(xì)節(jié):
調(diào)用executeUpdate
方法來(lái)將SQLite語(yǔ)句中?
所指代的具體參數(shù)傳入,通常使用變長(zhǎng)參數(shù)來(lái)傳遞進(jìn)去的,像這樣:
NSString* sql = @"INSERT INTO t_student (name, age) VALUES (?, ?)";
[_dataBase executeUpdate: sql, name, @(arc4random_uniform(40))];
變長(zhǎng)參數(shù)的作用體現(xiàn)在這里
要注意的是,參數(shù)必須是NSObject
的子類,所以如果有C風(fēng)格的數(shù)據(jù)類型,應(yīng)包裝成OC風(fēng)格才能使用:
//錯(cuò)誤
//[_dataBase executeUpdate: @"INSERT INTO t_student VALUES (?)", 42];
//正確
[_dataBase executeUpdate: @"", [NSNumber numberWithInt: 42]];
數(shù)據(jù)庫(kù)隊(duì)列
FMDatabaseQueue涉及到保證線程安全,編者此時(shí)此刻并未學(xué)習(xí)有關(guān)線程相關(guān)知識(shí),以后再加以了解文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-799518.html
總結(jié)
FMDB對(duì)SQLite進(jìn)行了良好的封裝,使用起來(lái)非常方便,對(duì)于那些使用純SQLite來(lái)進(jìn)行數(shù)據(jù)庫(kù)操作的項(xiàng)目,可以將其遷移到FMDB上,提高數(shù)據(jù)庫(kù)相關(guān)功能維護(hù)的效率文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-799518.html
到了這里,關(guān)于【iOS】數(shù)據(jù)持久化(四)之FMDB基本使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!