日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS - 数据持久化之 FMDB 的使用

發布時間:2025/3/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 對象
- (VGUser *)findById:(NSString *)userId {if (![self.db open]) {NSLog(@"數據庫打開失敗");} else {// 獲取查詢的結果集FMResultSet *rs = [self.db executeQuery:@"select user_id, user_name, user_age from user where user_id = ?", userId];// 判斷是否有查詢結果if ([rs next]) {VGUser *user = [[VGUser alloc] initWithUserId:[rs stringForColumn:@"user_id"]userName:[rs stringForColumn:@"user_name"]userAge:[rs intForColumn:@"user_age"]];[rs close];[self.db close];return user;}[rs close];}[self.db close];return nil; }

這個是查詢用戶表所有數據的方法,可以看到當 [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 的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。