oc中FMDB数据存储工具类

先上代码

#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(@"创建表失败:%@", [_db lastErrorMessage]);
        }
    } else {
        NSLog(@"打开数据库失败:%@", [_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(@"插入数据失败:%@", [_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(@"删除数据失败:%@", [_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(@"更新数据失败:%@", [_db lastErrorMessage]);
    }
}

@end

这个工具类名为 FMDBManager,使用了单例模式。在单例的初始化方法 setupDatabase 中,首先获取应用程序沙盒中的 Documents 目录,然后在该目录下创建一个名为 mydatabase.sqlite 的 SQLite 数据库文件,并使用 FMDatabase 类创建一个名为 _db 的数据库对象。

然后,通过执行 SQL 语句创建一个名为 mytable 的表。在 insertDataWithDictionary 方法中,使用 executeUpdate:arguments: 方法执行插入数据的 SQL 语句。在 getAllData方法中,使用 executeQuery: 方法执行查询数据的 SQL 语句,得到一个 FMResultSet 对象。然后使用 while 循环遍历查询结果,将每一行数据转换为字典对象,并添加到一个可变数组中。最后,返回该数组。

deleteDataWithId 方法中,使用 executeUpdate:arguments: 方法执行删除数据的 SQL 语句。在 updateDataWithDictionary 方法中,使用 executeUpdate:arguments: 方法执行更新数据的 SQL 语句。

使用方法

// 插入数据
NSDictionary *dictionary = @{@"name": @"Tom", @"age": @18};
[[FMDBManager sharedManager] insertDataWithDictionary:dictionary];

// 查询所有数据
NSArray *result = [[FMDBManager sharedManager] getAllData];
NSLog(@"查询结果:%@", result);

// 删除数据
NSInteger idToDelete = 1;
[[FMDBManager sharedManager] deleteDataWithId:idToDelete];

// 更新数据
NSDictionary *dictionaryToUpdate = @{@"id": @2, @"name": @"Jerry", @"age": @20};
[[FMDBManager sharedManager] updateDataWithDictionary:dictionaryToUpdate];

这个示例中,首先插入了一条数据,然后查询所有数据并输出结果。接着删除了一条数据,最后更新了一条数据。需要注意的是,示例中的 SQL 语句都比较简单,实际开发中可能需要更加复杂的 SQL 语句来实现更加灵活的数据存储和查询。

存储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(@"插入数据失败");
    }
}

在查询 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 中的属性名与数据库中的列名一致,否则可能会出现错误。另外,如果 Model 中的属性比较复杂,如包含了数组、字典等嵌套结构,转换可能会比较复杂,需要进行适当的处理。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容