一、FMDB基本使用
1、什么是FMDB?
FMDB是一款簡潔、易用的封裝庫。因此,在這里推薦使用第三方框架FMDB,它是對libsqlite3框架的封裝,用起來的步驟與SQLite使用類似,并且它對于多線程的并發操作進行了處理,所以是線程安全的。
2、FMDB的優缺點?
優點:
對多線程的并發操作進行處理,所以是線程安全的;
以OC的方式封裝了SQLite的C語言API,使用起來更加的方便;
FMDB是輕量級的框架,使用靈活。
缺點:
因為它是OC的語言封裝的,只能在ios開發的時候使用,所以在實現跨平臺操作的時候存在局限性。
3、FMDB的安裝方式?
可以用CocoaPod安裝,pod 'FMDB',也可以手動下載導入,GitHub鏈接: https://github.com/ccgus/fmdb,然后導入系統依賴庫sqlite3.0.tbd。
4、FMDB核心類
FMDatabase數據庫,一個FMDatabase對象就代表一個單獨的SQLite數據庫用來執行SQL語句。
FMResultSet查詢結果集,使用FMDatabase執行查詢后的結果集。
FMDatabaseQueue線程安全數據庫操作,用于在多線程中執行多個查詢或更新,它是線程安全的。
5、FMDB使用步驟
打開數據庫,通過指定SQLite數據庫文件路徑來創建FMDatabase對象,指定具體文件路徑時,如果不存在會自動創建;為空字符串@""時,會在臨時目錄創建一個空的數據庫當FMDatabase連接關閉時,數據庫文件也被刪除;為nil時,會創建一個內存中臨時數據庫,當FMDatabase連接關閉時,數據庫會被銷毀。
打開數據庫:
FMDatabase *db = [FMDatabase databaseWithPath:path];
if ([db open])? { NSLog(@"打開成功!"); }
執行更新:
在FMDB中,除查詢以外的所有操作,都稱為“更新”
create、drop、insert、update、delete等
使用executeUpdate:方法執行更新
// FMDB更新方法
-(BOOL)executeUpdate:(NSString)sql, ...
-(BOOL)executeUpdateWithFormat:(NSString)format, ...
-(BOOL)executeUpdate:(NSString)sql withArgumentsInArray:(NSArray )arguments
更新示例:
[db executeUpdate:@"UPDATE t_student SET age = ? WHERE name = ?;", @20, @"Jack"]
執行查詢:
- (FMResultSet *)executeQuery:(NSString*)sql, ...
- (FMResultSet *)executeQueryWithFormat:(NSString*)format, ...
- (FMResultSet *)executeQuery:(NSString *)sql withArgumentsInArray:(NSArray *)arguments
執行查詢示例:
// 查詢數據
FMResultSet *rs = [db executeQuery:@"SELECT * FROM t_student"];
// 遍歷結果集
while ([rs next]) {
NSString *name = [rs stringForColumn:@"name"];
int age = [rs intForColumn:@"age"];
double score = [rs doubleForColumn:@"score"];
}
關閉數據庫:
[self.db close];
二、FMDabaseQueue的簡單使用
1、FMDabaseQueue簡介
FMDatabase這個類是線程不安全的,如果在多個線程中同時使用一個FMDatabase實例,會造成數據混亂等問題,為了保證線程安全,FMDB提供方便快捷的FMDatabaseQueue類。
2、FMDabaseQueue的使用
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:path];
簡單使用
[queue inDatabase:^(FMDatabase *db) {
[db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jack"];
// 查詢
FMResultSet *rs = [db executeQuery:@"select * from t_student"];
}];
使用事務
[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
[db executeUpdate:@"INSERT INTO t_student(name) VALUES (?)", @"Jack"];
//查詢
FMResultSet *rs = [db executeQuery:@"select * from t_student"];
}];
三、FMDB FMDatabase類的簡單使用
1、手動集成FMDB步驟
下載FMDB GitHub鏈接: https://github.com/ccgus/fmdb,將FMDB框架文件夾拖入工程,添加系統依賴庫sqlite3.0.tbd,導入FMDB.h頭文件,編譯成功,集成FMDB完成。
2、創建數據庫和數據表基本步驟
(1)拼接數據庫存儲的沙盒路徑
(2)通過路徑創建數據庫
(3)打開數據庫
如果成功打開數據庫后,創建數據表。
創建數據庫和數據表參考代碼:
- (void)viewDidLoad {
[super viewDidLoad];
// 0.拼接數據庫存放的沙盒路徑
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
NSString *sqlFilePath = [path stringByAppendingPathComponent:@"student.sqlite"];
// 1.通過路徑創建數據庫
self.db = [FMDatabase databaseWithPath:sqlFilePath];
// 2.打開數據庫
if ([self.db open]) {
NSLog(@"打開成功");
BOOL success = [self.db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER DEFAULT 1)"];
if (success) {
NSLog(@"創建表成功");
} else {
NSLog(@"創建表失敗");
}
} else {
NSLog(@"打開失敗");
}
}
3、FMDatabase數據庫的增刪改查
// 1.插入數據
static NSInteger age = 10;
age++;
BOOL success = [self.db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);", @"jack", @(age)];
if (success) {
NSLog(@"插入成功");
} else {
NSLog(@"插入失敗");
}
// 2.刪除數據
BOOL success = [self.db executeUpdate:@"DELETE FROM t_student WHERE age > 20 AND age < 25;"];
// 3.修改數據
BOOL success = [self.db executeUpdate:@"UPDATE t_student SET name = 'liwx' WHERE age > 12 AND age < 15;"];
// 4.查詢數據
FMResultSet *result = [self.db executeQuery:@"SELECT id, name, age FROM t_student WHERE age > 25;"];
while ([result next]) {
int ID = [result intForColumnIndex:0];
NSString *name = [result stringForColumnIndex:1];
int age = [result intForColumn:@"age"];
NSLog(@"ID: %zd, name: %@, age: %zd", ID, name, age);
}
四、FMDatabaseQueue數據庫隊列基本使用
使用FMDatabaseQueue類在多線程中執行多個查詢或更新是線程安全的。
1、使用FMDatabaseQueue創建數據庫
(1)創建一個FMDatabaseQueue對象
只要成功創建數據庫隊列對象,FMDB內部就會自動給我們加載數據庫對象,無需再執行打開數據庫操作。
(2)使用block傳遞數據庫
使用 inDatabase:方法傳遞數據庫對象。
(3)使用SQL語句創建數據表
- (void)viewDidLoad {
[super viewDidLoad];
// 0.拼接數據庫存放的沙盒路徑
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
NSString *sqlFilePath = [path stringByAppendingPathComponent:@"student.sqlite"];
// 1.創建一個FMDatabaseQueue對象
// 只要創建數據庫隊列對象, FMDB內部就會自動給我們加載數據庫對象
// 2.執行操作
// 會通過block傳遞隊列中創建好的數據庫
[self.dbQueue inDatabase:^(FMDatabase *db) {
BOOL success = [db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER DEFAULT 1);"];
if (success) {
NSLog(@"創建表成功");
} else {
NSLog(@"創建表失敗");
}
}];
}
2、FMDatabaseQueue隊列數據庫的增刪改查
(1)插入數據
- (IBAction)insertClick {
static NSInteger age = 10;
age++;
[self.dbQueue inDatabase:^(FMDatabase *db) {
BOOL success = [db executeUpdate:@"INSERT INTO t_student (name, age) VALUES (?, ?);", @"jack", @(age)];
if (success) {
NSLog(@"插入成功");
} else {
NSLog(@"插入失敗");
}
}];
}
(2)刪除數據
// 刪除數據
[self.dbQueue inDatabase:^(FMDatabase *db) {
BOOL success = [db executeUpdate:@"DELETE FROM t_student WHERE age > 20 AND age < 25;"];
// 判斷是否SQL是否執行成功
// ...
}
(3)修改數據
// 修改數據
[self.dbQueue inDatabase:^(FMDatabase *db) {
BOOL success = [db executeUpdate:@"UPDATE t_student SET name = 'liwx' WHERE age > 12 AND age < 15;"];
// 判斷是否SQL是否執行成功
// ...
}
(4)查詢數據
// 查詢數據
- (IBAction)queryClick {
[self.dbQueue inDatabase:^(FMDatabase *db) {
FMResultSet *result = [db executeQuery:@"SELECT id, name, age FROM t_student WHERE age > 25;"];
while ([result next]) {
int ID = [result intForColumnIndex:0];
NSString *name = [result stringForColumnIndex:1];
int age = [result intForColumn:@"age"];
NSLog(@"ID: %zd, name: %@, age: %zd", ID, name, age);
}
}];
}