在日常的開發(fā)中,我們需要用到離線緩存將數(shù)據(jù)信息存入數(shù)據(jù)庫灸芳,在沒有網(wǎng)絡(luò)的時候進(jìn)行加載试溯,而我們IOS用的就是sqlite3數(shù)據(jù)庫,用原生的sql我們也能實(shí)現(xiàn)互躬,但是書寫起來比較麻煩脐往,這樣我們需要第三方FMDB。
在FMDB下載文件后谒获,工程中必須導(dǎo)入如下文件蛤肌,并使用 libsqlite3.dylib 依賴包壁却。
FMDB常用類
FMDatabase : 一個單一的SQLite數(shù)據(jù)庫,用于執(zhí)行SQL語句裸准。
FMResultSet :執(zhí)行查詢一個FMDatabase結(jié)果集展东。
FMDatabaseQueue :在多個線程來執(zhí)行查詢和更新時會使用這個類
操作數(shù)據(jù)庫
創(chuàng)建并且打開數(shù)據(jù)庫
// 1 獲取數(shù)據(jù)庫對象
NSString *path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
path=[path stringByAppendingPathComponent:@"test.sqlite"];
dataBase=[FMDatabase databaseWithPath:path];
// 2 打開數(shù)據(jù)庫,如果不存在則創(chuàng)建并且打開
BOOL open=[dataBase open];
if(open){
NSLog(@"數(shù)據(jù)庫打開成功");
}
//3 創(chuàng)建表
NSString * create1=@"create table if not exists t_user(id integer autoincrement primary key,name varchar)";
BOOL c1= [dataBase executeUpdate:create1];
if(c1){
NSLog(@"創(chuàng)建表成功");
}
//4 插入數(shù)據(jù)
NSString * insertSql=@"insert into t_user(id,name) values(?,?)";
// 插入語句1
bool inflag1=[dataBase executeUpdate:insertSql,@(2),@"admin"];
// 插入語句2
bool inflag2=[dataBase executeUpdate:insertSql withArgumentsInArray:@[@"admin",@(5)]];
// 插入語句3
bool inflag3=[dataBase executeUpdateWithFormat:@"insert into t_user(id,name) values(%@,%d)",@"admin",6];
// 刪除語句
NSString * delete=@"delete from t_user";
BOOL dflag= [dataBase executeUpdate:delete];
if(dflag){
NSLog(@"刪除成功");
}
// 修改語句
NSString *update=@" update t_user set name=? ";
BOOL flag= [dataBase executeUpdate:update,@"zhangsan"];
if(flag){
NSLog(@"修改成功");
}
// 5查詢數(shù)據(jù)FMDB的FMResultSet提供了多個方法來獲取不同類型的數(shù)據(jù)
NSString * sql=@" select * from t_user ";
FMResultSet *result=[dataBase executeQuery:sql];
while(result.next){
int ids=[result intForColumn:@"id"];
NSString * name=[result stringForColumn:@"name"];
int ids=[result intForColumnIndex:0];
NSString * name=[result stringForColumnIndex:1];
NSLog(@"%@,%d",name,ids);
}
如果應(yīng)用中使用了多線程操作數(shù)據(jù)庫炒俱,那么就需要使用FMDatabaseQueue來保證線程安全了盐肃。 應(yīng)用中不可在多個線程中共同使用一個FMDatabase對象操作數(shù)據(jù)庫,這樣會引起數(shù)據(jù)庫數(shù)據(jù)混亂权悟。 為了多線程操作數(shù)據(jù)庫安全砸王,F(xiàn)MDB使用了FMDatabaseQueue,使用FMDatabaseQueue很簡單峦阁,首先用一個數(shù)據(jù)庫文件地址來初使化FMDatabaseQueue谦铃,然后就可以將一個閉包(block)傳入inDatabase方法中。 在閉包中操作數(shù)據(jù)庫榔昔,而不直接參與FMDatabase的管理
//2多線程操作
NSString *path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
path=[path stringByAppendingPathComponent:@"test.sqlite"];
FMDatabaseQueue * queue=[FMDatabaseQueue databaseQueueWithPath:path];
[queue inDatabase:^(FMDatabase *db) {
NSString * create=@"create table if not exists t_book(id integer,name varchar)";
BOOL c1= [db executeUpdate:create];
if(c1){
NSLog(@"成功");
}
}];
[queue inDatabase:^(FMDatabase *db) {
NSString * insertSql=@"insert into t_book(id,name) values(?,?)";
//插入語句1
bool inflag=[db executeUpdate:insertSql,@(2),@"admin"];
if(inflag){
NSLog(@"插入成功");
}
}];
[queue inDatabase:^(FMDatabase *db) {
FMResultSet * data=[db executeQuery:@" select * from t_book "];
while (data.next) {
int ids=[data intForColumn:@"id"];
NSString *name=[data stringForColumn:@"name"];
NSLog(@"%@",name);
NSLog(@"%i",ids);
}
}];