美文网首页
oc中FMDB数据存储工具类

oc中FMDB数据存储工具类

作者: JackerooChu | 来源:发表于2023-04-06 10:03 被阅读0次

    先上代码

    #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 中的属性比较复杂,如包含了数组、字典等嵌套结构,转换可能会比较复杂,需要进行适当的处理。

    相关文章

      网友评论

          本文标题:oc中FMDB数据存储工具类

          本文链接:https://www.haomeiwen.com/subject/cgtuddtx.html