@(〓〓 iOS-實用技術)[SQLite 數據庫]
- 作者: Liwx
- 郵箱: 1032282633@qq.com
目錄
- 09.iOS FMDB的基本使用
- 1.FMDB基本使用
- FMDB簡介
- FMDB的安裝方式
- FMDB核心類
- FMDatabase數據庫
- FMResultSet查詢結果集
- FMDatabaseQueue線程安全數據庫操作
- FMDB使用步驟
- 2.FMDabaseQueue的簡單使用
- FMDabaseQueue簡介
- FMDabaseQueue的使用
- 3.FMDB FMDatabase類的簡單使用
- 手動集成FMDB步驟
- 創建數據庫和數據表基本步驟
- FMDatabase數據庫的增刪改查(CRUD)
- 4.FMDatabaseQueue數據庫隊列基本使用
- 使用FMDatabaseQueue創建數據庫
- FMDatabaseQueue隊列數據庫的增刪改查(CRUD)
1.FMDB基本使用
FMDB簡介
- 1.什么是FMDB?
FMDB是iOS平臺的SQLite數據庫框架
FMDB以OC的方式封裝了SQLite的C語言API
- 2.FMDB有什么優勢?
使用起來更加面向對象,省去了很多麻煩、冗余的C語言代碼
提供了多線程安全的數據庫操作方法,有效地防止數據混亂
FMDB的安裝方式
- 1.Cocoapods
pod 'FMDB'
- 2.手動集成
- 1.下載FMDB框架
FMDB GitHub鏈接: https://github.com/ccgus/fmdb
- 1.下載FMDB框架
1.導入FMDB文件
2.導入系統依賴庫sqlite3.0.tbd
FMDB核心類
FMDatabase數據庫
一個FMDatabase對象就代表一個單獨的
SQLite數據庫
用來執行SQL語句
FMResultSet查詢結果集
使用FMDatabase執行查詢后的
結果集
FMDatabaseQueue線程安全數據庫操作
用于在多線程中執行多個查詢或更新,它是
線程安全
的
FMDB使用步驟
-
1.打開數據庫
通過指定SQLite數據庫文件路徑來創建FMDatabase對象具體文件路徑
如果不存在會自動創建.
空字符串@""
會在臨時目錄創建一個空的數據庫當FMDatabase連接關閉時,數據庫文件也被刪除
nil
會創建一個內存中臨時數據庫,當FMDatabase連接關閉時,數據庫會被銷毀
// 1.打開數據庫
FMDatabase *db = [FMDatabase databaseWithPath:path];
if ([db open]) { NSLog(@"打開成功!"); }
- 2.執行更新
在FMDB中,除查詢以外的所有操作,都稱為“更新”
create、drop、insert、update、delete
等
使用executeUpdate:方法執行更新
// FMDB更新方法
-(BOOL)executeUpdate:(NSString)sql, ...
-(BOOL)executeUpdateWithFormat:(NSString)format, ...
-(BOOL)executeUpdate:(NSString*)sql withArgumentsInArray:(NSArray *)arguments
- 執行更新示例:
// 2.執行更新
[db executeUpdate:@"UPDATE t_student SET age = ? WHERE name = ?;", @20, @"Jack"]
- 3.執行查詢
- 查詢方法
- (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"];
}
- 4.關閉數據庫
[self.db close];
2.FMDabaseQueue的簡單使用
FMDabaseQueue簡介
FMDatabase這個類是線程不安全的,如果在多個線程中同時使用一個FMDatabase實例,會造成數據混亂等問題
為了保證線程安全,FMDB提供方便快捷的FMDatabaseQueue類
FMDabaseQueue的使用
- 1.FMDatabaseQueue的使用
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"];
}];
3.FMDB FMDatabase類的簡單使用
手動集成FMDB步驟
- 1.下載FMDB框架
FMDB GitHub鏈接: https://github.com/ccgus/fmdb
- 2.將fmdb框架文件夾拖入工程
- 3.添加系統依賴庫
sqlite3.0.tbd
- 4.導入
FMDB.h
頭文件,編譯成功.集成FMDB完成
創建數據庫和數據表基本步驟
- 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(@"打開失敗");
}
}
FMDatabase數據庫的增刪改查(CRUD
)
- 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);
}
4.FMDatabaseQueue數據庫隊列基本使用
使用FMDatabaseQueue類在多線程中執行多個查詢或更新是
線程安全
的.
使用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內部就會自動給我們加載數據庫對象
self.dbQueue = [FMDatabaseQueue databaseQueueWithPath:sqlFilePath];
// 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(@"創建表失敗");
}
}];
}
FMDatabaseQueue隊列數據庫的增刪改查(CRUD
)
- 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);
}
}];
}