基類
- FMDatabase:是一個提供 SQLite 數(shù)據(jù)庫的類,用于執(zhí)行 SQL 語句兔港。
- FMResultSet:用在 FMDatabase 中執(zhí)行查詢的結(jié)果的類。
- FMDatabaseQueue:在多線程下查詢和更新數(shù)據(jù)庫用到的類。
導(dǎo)入:
- pod后---> 導(dǎo)入libsqlite3.0框架荡含,導(dǎo)入頭文件FMDatabase.h
步驟實現(xiàn),與SQLite使用步驟相似届垫。
1释液、創(chuàng)建數(shù)據(jù)庫路徑,
數(shù)據(jù)庫創(chuàng)建
創(chuàng)建FMDatabase對象時參數(shù)為SQLite數(shù)據(jù)庫文件路徑装处,該路徑可以是以下三種方式之一
1.文件路徑误债。該文件路徑無需真實存在,如果不存在會自動創(chuàng)建
2.空字符串(@“”)妄迁。表示會在臨時目錄創(chuàng)建一個空的數(shù)據(jù)庫寝蹈,當(dāng)FMDatabase連接關(guān)閉時,文件也會被刪除
3.NULL登淘。將創(chuàng)建一個內(nèi)在數(shù)據(jù)庫箫老,同樣的,當(dāng)FMDatabase連接關(guān)閉時黔州,數(shù)據(jù)將會被銷毀
2耍鬓、獲得數(shù)據(jù)庫路徑阔籽,
//1.獲得數(shù)據(jù)庫文件的路徑
NSString *doc =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) lastObject];
NSString *fileName = [doc stringByAppendingPathComponent:@“student.sqlite”];
3、打開數(shù)據(jù)庫牲蜀,創(chuàng)建一個索引是id的字符串類型name和integer類型age
//2.獲得數(shù)據(jù)庫
FMDatabase *db = [FMDatabase databaseWithPath:fileName];
//3.使用如下語句笆制,如果打開失敗,可能是權(quán)限不足或者資源不足涣达。通常打開完操作操作后在辆,需要調(diào)用 close 方法來關(guān)閉數(shù)據(jù)庫。在和數(shù)據(jù)庫交互 之前峭判,數(shù)據(jù)庫必須是打開的开缎。如果資源或權(quán)限不足無法打開或創(chuàng)建數(shù)據(jù)庫棕叫,都會導(dǎo)致打開失敗林螃。
if ([db open])
{
//4.創(chuàng)表
BOOL result = [db executeUpdate:@“CREATE TABLE IF NOT EXISTS t_student (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL);”];
if (result)
{
NSLog(@“創(chuàng)建表成功”);
}else{
NSLog(@“創(chuàng)建表失敗”);
}
}
4、然后對數(shù)據(jù)庫進行增俺泣、刪疗认、改、查操作伏钠,
一切不是SELECT命令的命令都視為更新横漏。這包括 CREAT,UPDATE,INSERT,ALTER,BEGIN,COMMIT,DETACH,DELETE,DROP,END,EXPLAIN,VACUUM,REPLACE等。
簡單來說熟掂,只要不是以SELECT開頭的命令都是更新命令缎浇。
執(zhí)行更新返回一個BOOL值。YES表示 執(zhí)行成功赴肚,否則表示有錯誤素跺。你可以調(diào)用 -lastErrorMessage 和 -lastErrorCode方法來得到更多信息。
- 使用FMDataBase類的3種方式執(zhí)行數(shù)據(jù)庫插入命令SQLinsert into
int age = 42;
//1.executeUpdate:不確定的參數(shù)用誉券?來占位(后面參數(shù)必須是oc對象指厌,;代表語句結(jié)束)
[self.db executeUpdate:@“INSERT INTO t_student (name, age) VALUES (?,?);”,name,@(age)];
//2.executeUpdateWithForamat:不確定的參數(shù)用%@踊跟,%d等來占位 (參數(shù)為原始數(shù)據(jù)類型踩验,執(zhí)行語句不區(qū)分大小寫)
[self.db executeUpdateWithForamat:@“insert into t_student (name,age) values (%@,%i);”,name,age];
//3.參數(shù)是數(shù)組的使用方式
[self.db executeUpdate:@“INSERT INTO
t_student(name,age) VALUES (?,?);”withArgumentsInArray:@[name,@(age)]];
- 使用FMDataBase類執(zhí)行數(shù)據(jù)庫刪除命令SQLdelete
//1.不確定的參數(shù)用?來占位 (后面參數(shù)必須是oc對象,需要將int包裝成OC對象)
int idNum = 101;
[self.db executeUpdate:@“delete from t_student where id = ?;”,@(idNum)];
//2.不確定的參數(shù)用%@商玫,%d等來占位
[self.db executeUpdateWithFormat:@“delete from t_student where name = %@;”,@“apple_name”];
- 使用FMDataBase類執(zhí)行數(shù)據(jù)庫修改命令SQLupdate
//修改學(xué)生的名字
[self.db executeUpdate:@“update t_student set name = ? where name = ?”,newName,oldName];
- 使用FMDataBase類執(zhí)行數(shù)據(jù)庫查詢命令SQLselect ... from
SELECT命令就是查詢箕憾,執(zhí)行查詢的方法是以-excuteQuery開頭的。
執(zhí)行查詢時拳昌,如果成功返回FMResultSet對象袭异,錯誤返回nil。與執(zhí)行更新相當(dāng)地回,支持使用NSError參數(shù)扁远。
同時俊鱼,你也可以使用-lastErrorCode和-lastErrorMessage獲知錯誤信息。
FMResultSet獲取不同數(shù)據(jù)格式的方法
intForColumn:
longForColumn:
longLongIntForColumn:
boolForColumn:
doubleForColumn:
stringForColumn:
dataForColumn:
dataNoCopyForColumn:
UTF8StringForColumnIndex:
objectForColumn:
- 使用FMResultSet獲取查詢語句結(jié)果
//查詢整個表
FMResultSet *resultSet = [self.db execute Query:@“select * from t_student;”];
//根據(jù)條件查詢
FMResultSet *resultSet = [self.db executeQuery:@“select * from t_student where id<?;”@(14)];
//遍歷結(jié)果集合
while ([resultSet next])
{
int idNum = [resultSet intForColumn:@“id”]畅买;
NSString *name = [resultSet
objectForColumn:@“name”];
int age = [resultSet intForColumn:@“age”];
}
- 使用FMDataBase類執(zhí)行數(shù)據(jù)庫銷毀命令SQLdrop ...
//如果表格存在 則銷毀
[self.db executeUpadate:@“drop table if exists t_student;”];
- 使用FMDatabaseQueue類實現(xiàn)多線程操作
在多個線程中同時使用一個FMDatabase實例是不明智的〔⑾校現(xiàn)在你可以為每 個線程創(chuàng)建一個FMDatabase對象,不要讓多個線程分享同一個實例谷羞,他無 法在多個線程中同事使用帝火。否則程序會時不時崩潰或者報告異常。所以湃缎,不要 初始化FMDatabase對象犀填,然后在多個線程中使用。這時候嗓违,我們就需要使 用FMDatabaseQueue來創(chuàng)建隊列執(zhí)行事務(wù)九巡。
//1.創(chuàng)建隊列
FMDatabaseQueue *queue = [FMDatabaseQueue
databaseQueueWithPath:aPath];
__block BOOL whoopsSomethingWrongHappened = true;
//2.把任務(wù)包裝到事務(wù)里
[queue inTransaction:^(FMDatabase *db, BOOL *rollback)
{
whoopsSomethingWrongHappened &= [db executeUpdate:@“INSERT INTO myTable VALUES (?)”, [NSNumber numberWith:1]];
whoopsSomethingWrongHappened &= [db
executeUpdata:@“INSERT INTO myTable VALUES (?)”,
[NSNumber numberWithInt:2]];
whoopsSomethingWrongHappened &= [db
executeUpdata:@“INSERT INTO myTable VALUES (?)”[NSNumber
numberWithInt:3]];
//如果有錯誤 返回
if (!whoopsSomethingWrongHappened)
{
*rollback = YES;
return;
}
}];
5、最后關(guān)閉數(shù)據(jù)庫蹂季。
[_db close];