iOS - 数据持久化之 FMDB 的使用
前言
上一篇文章「iOS - 使用 SQLite 數據庫實現數據持久化」,介紹了如何使用 sqlite3 操作 SQLite 數據庫實現增刪改查。但是在代碼編寫的過程中,我們發現 sqlite3 需要調用大量的 C 語言函數,需要進行各種 C 語言類型到 OC 對象的轉換,這會帶來很多使用上的不便。
于是,經過查找發現了基于 sqlite3 封裝的 FMDB,它能夠較大程度地簡化我們的代碼,也就是本文將要介紹的內容。
文章目錄
- 前言
- FMDB 簡介
- FMDB 的引入
- FMDB 的使用
- 建表操作
- 查詢操作
- 插入操作
- 刪除操作
- 修改操作
- FMDB 線程安全
- 參考資料
FMDB 簡介
FMDB 是 iOS 平臺的 SQLite 數據庫開源庫,它對 libsqlite3 的 C 語言 API 用 OC 的方法進行了封裝,它的使用和 libsqlite3 相似,但是大大提高了使用的便捷性。同時,還提供了多線程安全的數據庫操作方法,能有效地防止數據混亂。
Github 倉庫地址:https://github.com/ccgus/fmdb
FMDB 三大核心類:
-
FMDatabase 表示數據庫類,一個 FMDatabase 對象就代表一個單獨的 SQLite 數據庫用來執行 SQL 語句。
-
FMResultSet 表示查詢結果集類,用于接收 FMDatabase 執行查詢后的結果集。
-
FMDatabaseQueue 封裝了線程安全數據庫操作,用于在多線程中執行多個查詢或更新,它是線程安全的。
FMDB 的引入
因為 FMDB 是依賴于 sqlite3 的,所以先要在項目中導入 libsqlite3.tbd,詳情可以參考上一篇文章「iOS - 使用 SQLite 數據庫實現數據持久化」。
現在的項目大多都是通過 Cocoapods 管理依賴的庫,我們只需要在 Podfile 中添加如下依賴,然后執行 pod Install 就能引入 FMDB 了。
pod 'FMDB'FMDB 的使用
為了能充分感受到 FMDB 的便捷,我們依舊使用上一篇文章提到的例子:「我們有個用戶表,里面有用戶id,用戶名稱和用戶年齡等三個字段,我們使用 FMDB 對它進行增刪改查」。
我們還是創建一個 VGFMUserDAO 類來完成上述數組操作,該類提供的 API 接口還是和上一篇文章保持一致。
#import <fmdb/FMDB.h>@interface VGFMUserDAO ()// FMDatabase對象,表示一個數據庫 @property (nonatomic, strong) FMDatabase *db;@end單例對象的創建方法:
+ (instancetype)sheredInstance {static VGFMUserDAO *sharedInstance = nil;static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{sharedInstance = [[VGFMUserDAO alloc] init];// 獲取數據庫的存儲路徑,該方法的實現和上一篇文章保持一致NSString *dbFilePath = [sharedInstance applicationDocumentsDirectory];// 初始化單例對象的數據庫屬性sharedInstance.db = [FMDatabase databaseWithPath:dbFilePath];// 執行建表操作[sharedInstance createEditableDatabaseIfNeed];});return sharedInstance; }建表操作
這里使用到了 FMDatabase 對象的 executeUpdate: 方法執行建表語句。在 FMDB 中,除了查詢操作之外,執行其他 SQL 語句使用的都是 executeUpdate: 方法。
- (void)createEditableDatabaseIfNeed {if (![self.db open]) {NSLog(@"數據庫打開失敗");} else {// 執行建表語句BOOL result = [self.db executeUpdate:@"create table if not exists user (user_id text primary key, user_name text, user_age integer)"];if (!result) {NSLog(@"建表失敗");}}[self.db close]; }查詢操作
執行查詢操作的步驟:
- 使用 FMDatabase 對象的 open 方法打開數據庫
- 使用 FMDatabase 對象的 executeQuery: 方法執行查詢語句
- 使用 FMResultSet 對象接收查詢得到的結果集
- 通過 FMResultSet 對象的 xxxForColumn: 系列方法獲取到查詢的數據
- 關閉 FMDatabase 和 FMResultSet 對象
這個是查詢用戶表所有數據的方法,可以看到當 [rs next] 的返回值為真時,
- (NSArray *)findAll {if (![self.db open]) {NSLog(@"數據庫打開失敗");} else {FMResultSet *rs = [self.db executeQuery:@"select user_id, user_name, user_age from user"];NSMutableArray *userList = [NSMutableArray array];// 當條件成立,while ([rs next]) {VGUser *user = [[VGUser alloc] initWithUserId:[rs stringForColumn:@"user_id"]userName:[rs stringForColumn:@"user_name"]userAge:[rs intForColumn:@"user_age"]];[userList addObject:user];}[rs close];[self.db close];return userList;}[self.db close];return nil; }插入操作
本操作使用到了 FMDatabase 對象的 executeUpdate: 方法執行 SQL 插入語句,需要注意的是,在傳入參數的時候要把基本類型轉化為 OC 對象。
- (void)create:(VGUser *)user {if (![self.db open]) {NSLog(@"數據庫打開失敗");} else {// 這里注意要把 user.userAge 轉化為BOOL result = [self.db executeUpdate:@"insert or replace into user (user_id, user_name, user_age) values (?, ?, ?)", user.userId, user.userName, @(user.userAge)];if (!result) {NSLog(@"數據插入失敗");}}[self.db close]; }刪除操作
- (void)remove:(NSString *)userId {if (![self.db open]) {NSLog(@"數據庫打開失敗");} else {BOOL result = [self.db executeUpdate:@"delete from user where user_id = ?", userId];if (!result) {NSLog(@"數據刪除失敗");}}[self.db close]; }修改操作
- (void)modify:(VGUser *)user {if (![self.db open]) {NSLog(@"數據庫打開失敗");} else {BOOL result = [self.db executeUpdate:@"update user set user_name = ?, user_age = ? where user_id = ?", user.userName, @(user.userAge), user.userId];if (!result) {NSLog(@"數據刪除失敗");}}[self.db close]; }整段代碼寫下來,可以發現 FMDB 使用起來非常方便,減少了很多 C 語言函數的調用步驟,讓編寫的代碼變得簡潔,代碼行數減少了一半左右。
FMDB 線程安全
在多線程的場景下,我們通常會有保證讀寫操作線程安全的需求,這時我們可以用上 FMDB 提供的 FMDatabaseQueue 類,在其對象中執行的讀寫任務都是線程安全的。下面簡單介紹它的使用方法:
創建 FMDatabaseQueue 對象,需要傳入數據庫的存儲路徑。
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:dbFilePath];FMDatabaseQueue 類中內置了 FMDatabase 數據庫對象,不需要我們再額外進行數據庫的創建。我們只需要通過 Block 的形式給 FMDatabaseQueue 對象傳入任務,在 Block 執行需要的 SQL 語句即可。
[queue inDatabase:^(FMDatabase * _Nonnull db) {// 調用 db 的相應方法執行 SQL 語句 }];參考資料
- https://juejin.cn/post/6844903805369188359
- https://github.com/ccgus/fmdb#readme
總結
以上是生活随笔為你收集整理的iOS - 数据持久化之 FMDB 的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS - 使用 SQLite 数据库实
- 下一篇: iOS 多线程基础之 NSThread