要使用FMDB,先要添加庫文件libsqlite3.tbd
FMDB的介紹
- FMDB是iOS平臺的SQLite數(shù)據(jù)庫框架,以OC的方式封裝了SQLite的C語言API,使用起來比單純調用SQLite語句方便
- FMDB使用起來更加面向對象,省去了很多麻煩,冗余的C語言代碼
- 對比蘋果自帶的Core Data框架,更加輕量級和靈活
- 提供了多線程安全的數(shù)據(jù)庫操作方法,有效防止數(shù)據(jù)混亂
核心三大類
- FMDatabase(創(chuàng)建、刪除)
- 一個FMDBbase對象就代表一個單獨的SQLite數(shù)據(jù)庫
- 用來執(zhí)行SQL語句
- FMResultSet(用來查詢)
- 使用FMDB執(zhí)行查詢后的結果集
- FMDBbaseQueue
- 用于在多線程中執(zhí)行多個查詢或更新,它是線程安全的
使用步驟
-
打開數(shù)據(jù)庫
-
通過指定SQLite數(shù)據(jù)庫文件路徑來創(chuàng)建FMDatabase對象
FMDatabase *db = [FMDatabase databaseWithPath:path];
if ([db open]) {
// 數(shù)據(jù)庫打開成功
}
```- 文件路徑的三種情況
- 具體文件路徑
- 如果不存在會自動創(chuàng)建
- 空字符串@“”(不推薦)
- 會臨時創(chuàng)建一個空的數(shù)據(jù)庫
- 當FMDatabase連接關閉時,數(shù)據(jù)庫文件也被刪除
- nil
- 會創(chuàng)建一個內存中的臨時文件,當FMDatabase連接關閉時,數(shù)據(jù)庫也會被銷毀
- 具體文件路徑
-
-
執(zhí)行更新
- CREATE、DROP、INSERT、UPDATE、DELETE等除了查詢以外的操作,都稱為更新操作
- 使用executeUpdate:方法做更新操作
- -(BOOL)executeUpdate:(NSString*)sql, ...
- -(BOOL)executeUpdateWithFormat:(NSString*)format, ...
- -(BOOL)executeUpdate:(NSString)sql withArgumentsInArray:(NSArray )arguments
- 在SQL字符串中寫SQL語句
- 例子
[db executeUpdate:@"UPDATE t_student_classtwo SET age = ? WHERE name = ?;", @"21", @"hyq"]
-
執(zhí)行查詢
-
執(zhí)行數(shù)據(jù)庫查詢的方法:(查詢使用FMResultSet對象)
- -(FMResultSet )executeQuery:(NSString )sql, ...
- -(FMResultSet )executeQueryWithFormat:(NSString)format, ...
- -(FMResultSet )executeQuery:(NSString )sql withArgumentsInArray:(NSArray *)arguments
- 用 FMResultSet 對象的 next 方法來遍歷查詢到的數(shù)據(jù)
-
例子
// 查詢數(shù)據(jù)
FMResultSet *rs = [db executeQuery:@"SELECT * FROM t_student_classtwo"];
// 遍歷結果集
while ([rs next]) {
NSString *name = [rs stringForColumn:@"name"];
int age = [rs intForColumn:@"age"];
double score = [rs doubleForColumn:@"score"];
}
``` -
FMDatabaseQueue的使用
為什么使用FMDatabaseQueue
FMDatabase這個類是線程不安全的,如果在多個線程中同時使用一個FMDatabase實例,會造成數(shù)據(jù)混亂等問題
為了保證線程安全,F(xiàn)MDB提供了方便快捷的FMDatabaseQueue類
-
例子
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path]; [queue inDatabase:^(FMDatabase *db) { [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jack"]; [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Rose"]; [db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jim"]; FMResultSet *rs = [db executeQuery:@"select * from t_student"]; while ([rs next]) { // … } }];
開啟事務:事務對于數(shù)據(jù)庫的作用是對數(shù)據(jù)的一些列操作,要么全部成功,要么全部失敗,防止中間狀態(tài)的出現(xiàn),以確保數(shù)據(jù)庫中的數(shù)據(jù)始終處于正確及和諧狀態(tài)
[self.queue inDatabase:^(FMDatabase *db) {
// 開啟事務
[db beginTransaction];
BOOL result = [db executeUpdate:@"update t_student set age = 20 where id >= 20; "];
if (result) {
NSLog(@"修改成功");
}else{
NSLog(@"修改失敗");
}
// 提交事務
[db commit];
}];