提供git地址:https://github.com/ccgus/fmdb.
- 實現客戶端數據庫操作的第三方框架.
- 操作數據庫的類 : FMDatabase.h
- 隊列調度數據庫執行的類 : FMDatabaseQueue.h
- 查詢數據的類 : FMResultSet.h
注意
第三方的官方文檔是這麼說的:FMDatabaseQueue
If you're wanting to perform queries and updates on multiple threads, you'll want to use this class. It's described in the "Thread Safety" section below.
翻譯:如果你像去實現查找和更新在多線程上,你就是用這個類,這個是建立在線程安全之上的.
做法:一般自行封裝成一個工具類,設計成單例.
目的:全局只有一個串行隊列,這樣操作數據庫更加安全.
先創建.h文件
@interface FMDatabaseQueueManager : FMDatabaseQueue
//提供單例入口
+ (instancetype)sharedManager;
@end
在.m文件中實現方法,創建一個數據庫
+(instancetype)sharedManager{
static FMDatabaseQueueManager *instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 1.獲取數據庫路徑,將要把數據庫存到這個路徑中.
NSString *SQLPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"my.db"];
// 2. 創建管理數據庫對象
instance = [FMDatabaseQueueManager databaseQueueWithPath:SQLPath];
});
return instance;
}
新建表
[[FMDatabaseQueueManager sharedManager] inDatabase:^(FMDatabase *db) {
BOOL isCreate = [db executeUpdate:@"create table if not exists t_person(id integer primary key,name text not null,age integer);"];
使用事務插入數據
// 1.定義SQL語句
NSString *insertSQL = @"insert into t_person(name,age) values(?,?);";
// 2.隊列調度數據庫,使用事務插入數據,性能比原生SQLite3要好
[[FMDatabaseQueueManager sharedManager] inTransaction:^(FMDatabase *db, BOOL *rollback) {
// 3.循環新增大批量的數據
for (NSInteger i = 0; i < 1000; i++) {
// 4.執行SQL
BOOL isOK = [db executeUpdate:insertSQL,@"張三",@(100)];
// 出錯就回滾
if (!isOK) {
// 回滾快照
*rollback = YES;
// 非常重要
break;
}
}
}];
查詢數據
// 1.定義SQL語句
NSString *updateSQL = @"select name,age from t_person;";
// 2.隊列調度數據庫
[[FMDatabaseQueueManager sharedManager] inDatabase:^(FMDatabase *db) {
// 3.執行SQL
FMResultSet *resultSet = [db executeQuery:updateSQL];
// 4.逐條取記錄
while ([resultSet next]) {
NSString *name = [resultSet stringForColumn:@"name"];
int age = [resultSet intForColumn:@"age"];
NSLog(@"%@ -- %d",name,age);
}
}];
刪除數據
// 1.定義SQL語句
NSString *updateSQL = @"delete from t_person where id = ?;";
// 2.隊列調度數據庫
[[FMDatabaseQueueManager sharedManager] inDatabase:^(FMDatabase *db) {
// 3.執行SQL
BOOL isOK = [db executeUpdate:updateSQL,@(6)];
if (isOK) {
NSLog(@"刪除數據成功");
} else {
NSLog(@"刪除數據失敗");
}
}];
修改數據
// 1.定義SQL語句
NSString *updateSQL = @"update t_person set name = ?,age = ? where id = ?;";
// 2.隊列調度數據庫
[[FMDatabaseQueueManager sharedManager] inDatabase:^(FMDatabase *db) {
// 3.執行SQL
BOOL isOK = [db executeUpdate:updateSQL,@"王五",@(19),@(3)];
if (isOK) {
NSLog(@"更新數據成功");
} else {
NSLog(@"更新數據失敗");
}
NSLog(@"影響行數 %d", db.changes);
}];