oc中FMDB數(shù)據(jù)存儲工具類

先上代碼

#import "FMDBManager.h"
#import <FMDB/FMDB.h>

@implementation FMDBManager {
    FMDatabase *_db;
}

+ (instancetype)sharedManager {
    static FMDBManager *manager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [[FMDBManager alloc] init];
        [manager setupDatabase];
    });
    return manager;
}

- (void)setupDatabase {
    NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    NSString *databasePath = [documentsPath stringByAppendingPathComponent:@"mydatabase.sqlite"];
    _db = [FMDatabase databaseWithPath:databasePath];
    if ([_db open]) {
        NSString *createTableSql = @"CREATE TABLE IF NOT EXISTS mytable (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)";
        if (![_db executeUpdate:createTableSql]) {
            NSLog(@"創(chuàng)建表失敗:%@", [_db lastErrorMessage]);
        }
    } else {
        NSLog(@"打開數(shù)據(jù)庫失敗:%@", [_db lastErrorMessage]);
    }
}

- (void)insertDataWithDictionary:(NSDictionary *)dictionary {
    NSString *name = dictionary[@"name"];
    NSNumber *age = dictionary[@"age"];
    NSString *insertSql = @"INSERT INTO mytable (name, age) VALUES (?, ?)";
    if (![_db executeUpdate:insertSql, name, age]) {
        NSLog(@"插入數(shù)據(jù)失敗:%@", [_db lastErrorMessage]);
    }
}

- (NSArray *)getAllData {
    NSMutableArray *result = [NSMutableArray array];
    NSString *querySql = @"SELECT * FROM mytable";
    FMResultSet *resultSet = [_db executeQuery:querySql];
    while ([resultSet next]) {
        NSInteger id = [resultSet intForColumn:@"id"];
        NSString *name = [resultSet stringForColumn:@"name"];
        NSInteger age = [resultSet intForColumn:@"age"];
        NSDictionary *dictionary = @{@"id": @(id), @"name": name, @"age": @(age)};
        [result addObject:dictionary];
    }
    return result;
}

- (void)deleteDataWithId:(NSInteger)id {
    NSString *deleteSql = @"DELETE FROM mytable WHERE id = ?";
    if (![_db executeUpdate:deleteSql, @(id)]) {
        NSLog(@"刪除數(shù)據(jù)失敗:%@", [_db lastErrorMessage]);
    }
}

- (void)updateDataWithDictionary:(NSDictionary *)dictionary {
    NSInteger id = [dictionary[@"id"] integerValue];
    NSString *name = dictionary[@"name"];
    NSNumber *age = dictionary[@"age"];
    NSString *updateSql = @"UPDATE mytable SET name = ?, age = ? WHERE id = ?";
    if (![_db executeUpdate:updateSql, name, age, @(id)]) {
        NSLog(@"更新數(shù)據(jù)失敯卫场:%@", [_db lastErrorMessage]);
    }
}

@end

這個工具類名為 FMDBManager,使用了單例模式隘竭。在單例的初始化方法 setupDatabase 中塘秦,首先獲取應用程序沙盒中的 Documents 目錄,然后在該目錄下創(chuàng)建一個名為 mydatabase.sqlite 的 SQLite 數(shù)據(jù)庫文件动看,并使用 FMDatabase 類創(chuàng)建一個名為 _db 的數(shù)據(jù)庫對象尊剔。

然后,通過執(zhí)行 SQL 語句創(chuàng)建一個名為 mytable 的表菱皆。在 insertDataWithDictionary 方法中须误,使用 executeUpdate:arguments: 方法執(zhí)行插入數(shù)據(jù)的 SQL 語句。在 getAllData方法中仇轻,使用 executeQuery: 方法執(zhí)行查詢數(shù)據(jù)的 SQL 語句京痢,得到一個 FMResultSet 對象。然后使用 while 循環(huán)遍歷查詢結果篷店,將每一行數(shù)據(jù)轉換為字典對象祭椰,并添加到一個可變數(shù)組中。最后,返回該數(shù)組方淤。

deleteDataWithId 方法中钉赁,使用 executeUpdate:arguments: 方法執(zhí)行刪除數(shù)據(jù)的 SQL 語句。在 updateDataWithDictionary 方法中携茂,使用 executeUpdate:arguments: 方法執(zhí)行更新數(shù)據(jù)的 SQL 語句你踩。

使用方法

// 插入數(shù)據(jù)
NSDictionary *dictionary = @{@"name": @"Tom", @"age": @18};
[[FMDBManager sharedManager] insertDataWithDictionary:dictionary];

// 查詢所有數(shù)據(jù)
NSArray *result = [[FMDBManager sharedManager] getAllData];
NSLog(@"查詢結果:%@", result);

// 刪除數(shù)據(jù)
NSInteger idToDelete = 1;
[[FMDBManager sharedManager] deleteDataWithId:idToDelete];

// 更新數(shù)據(jù)
NSDictionary *dictionaryToUpdate = @{@"id": @2, @"name": @"Jerry", @"age": @20};
[[FMDBManager sharedManager] updateDataWithDictionary:dictionaryToUpdate];

這個示例中,首先插入了一條數(shù)據(jù)邑蒋,然后查詢所有數(shù)據(jù)并輸出結果姓蜂。接著刪除了一條數(shù)據(jù)按厘,最后更新了一條數(shù)據(jù)医吊。需要注意的是,示例中的 SQL 語句都比較簡單逮京,實際開發(fā)中可能需要更加復雜的 SQL 語句來實現(xiàn)更加靈活的數(shù)據(jù)存儲和查詢卿堂。

存儲Model

.h

@interface Person : NSObject

@property (nonatomic, assign) NSInteger id;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;

@end

.m

@implementation Person

@end

在存儲 Person 對象時,可以先將其轉換為 NSDictionary:

- (void)insertPerson:(Person *)person {
    NSString *sql = @"INSERT INTO person (name, age) VALUES (?, ?)";
    NSDictionary *arguments = @{@"name": person.name, @"age": @(person.age)};
    BOOL success = [self.db executeUpdate:sql withParameterDictionary:arguments];
    if (!success) {
        NSLog(@"插入數(shù)據(jù)失敗");
    }
}

在查詢 Person 對象時懒棉,可以先將查詢結果轉換為 NSDictionary 或 NSArray草描,再將其轉換為 Person 對象:

- (NSArray<Person *> *)getAllPersons {
    NSString *sql = @"SELECT * FROM person";
    FMResultSet *result = [self.db executeQuery:sql];
    NSMutableArray *persons = [NSMutableArray array];
    while ([result next]) {
        NSInteger personId = [result intForColumn:@"id"];
        NSString *name = [result stringForColumn:@"name"];
        NSInteger age = [result intForColumn:@"age"];
        Person *person = [[Person alloc] init];
        person.id = personId;
        person.name = name;
        person.age = age;
        [persons addObject:person];
    }
    return persons;
}

需要注意的是,在進行 Model 轉換時策严,要保證 Model 中的屬性名與數(shù)據(jù)庫中的列名一致穗慕,否則可能會出現(xiàn)錯誤。另外妻导,如果 Model 中的屬性比較復雜逛绵,如包含了數(shù)組、字典等嵌套結構倔韭,轉換可能會比較復雜术浪,需要進行適當?shù)奶幚怼?/p>

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市寿酌,隨后出現(xiàn)的幾起案子胰苏,更是在濱河造成了極大的恐慌,老刑警劉巖醇疼,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件硕并,死亡現(xiàn)場離奇詭異,居然都是意外死亡秧荆,警方通過查閱死者的電腦和手機倔毙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辰如,“玉大人普监,你說我怎么就攤上這事。” “怎么了凯正?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵毙玻,是天一觀的道長。 經常有香客問我廊散,道長桑滩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任允睹,我火速辦了婚禮运准,結果婚禮上,老公的妹妹穿的比我還像新娘缭受。我一直安慰自己胁澳,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布米者。 她就那樣靜靜地躺著韭畸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蔓搞。 梳的紋絲不亂的頭發(fā)上胰丁,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音喂分,去河邊找鬼锦庸。 笑死,一個胖子當著我的面吹牛蒲祈,可吹牛的內容都是我干的甘萧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼讳嘱,長吁一口氣:“原來是場噩夢啊……” “哼幔嗦!你這毒婦竟也來了?” 一聲冷哼從身側響起沥潭,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤邀泉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后钝鸽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體汇恤,經...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年拔恰,在試婚紗的時候發(fā)現(xiàn)自己被綠了因谎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡颜懊,死狀恐怖财岔,靈堂內的尸體忽然破棺而出风皿,到底是詐尸還是另有隱情,我是刑警寧澤匠璧,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布桐款,位于F島的核電站,受9級特大地震影響夷恍,放射性物質發(fā)生泄漏魔眨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一酿雪、第九天 我趴在偏房一處隱蔽的房頂上張望遏暴。 院中可真熱鬧,春花似錦指黎、人聲如沸朋凉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侥啤。三九已至当叭,卻和暖如春茬故,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蚁鳖。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工磺芭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人醉箕。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓钾腺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親讥裤。 傳聞我的和親對象是個殘疾皇子放棒,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內容