美文网首页数据存储
iOS - FMDB的二次封装

iOS - FMDB的二次封装

作者: charlotte2018 | 来源:发表于2017-07-19 14:34 被阅读148次

    为了把sql语句给藏起来,对fmdb做了二次的封装。仿照着kvc的样子,一个key对应一个value,一般情况下咱们请求下来的数据不就是字典转模型吗?把字典给存入数据库,下次拿出来直接用。我也看了他们写的对fmdb的封装,有的在model上做。用runtime获取属性对应的值写入数据库。意思差不多吧。我的提前了一步而已。借鉴了大神的思路。也写了个。如YYCache

    fmdb的基本用法在我这篇文章

    http://www.jianshu.com/p/8a86aa6da805

    将字典传入后首先用NSJSONSerialization把字典转为data,然后再转化为String,最后就存储字符串就行了。

    - (void)insertValue:(id)value forKey:(NSString *)key intoTable:(NSString *)tableName
    {
        BOOL nameIsTrue = [self checkTableName:tableName];
        if (nameIsTrue == NO) {
            return;
        }
        NSError *error;
        NSData *data = [NSJSONSerialization dataWithJSONObject:value options:NSJSONWritingPrettyPrinted error:&error];
        if (error ) {
            NSLog(@"获取json data失败");
        }
        NSString *jsonString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
        // replace into (insert into 的增强版)如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。否则,直接插入新数据。
        NSString *sqlString = [NSString stringWithFormat:@"REPLACE INTO %@ (key, value) values (?, ?)",tableName];
        
        __block BOOL isSuccess;
        
        [self.dataBaseQueue inDatabase:^(FMDatabase * _Nonnull db) {
            
            isSuccess = [db executeUpdate:sqlString,key,jsonString];
        }];
        
        if (isSuccess == YES) {
            NSLog(@"插入或者替换数据成功了");
        }else{
            NSLog(@"插入或者替换数据失败了");
        }
        
    }
    

    获取的时候正好相反的,把string从数据库取出来,转化为data,然后data再通过NSJSONSerialization转回到字典,说来倒去也就是把字典转成字符串,然后再转回去而已。思路挺简单的。

    - (id)getValueByKey:(NSString *)key fromTable:(NSString *)tableName
    {
        BOOL nameIsTrue = [self checkTableName:tableName];
        if (nameIsTrue == NO) {
            return nil;
        }
        NSString *sqlString = [NSString stringWithFormat:@"SELECT value from %@ where key = ?",tableName];
        
        __block NSString *jsonString;
        [self.dataBaseQueue inDatabase:^(FMDatabase * _Nonnull db) {
            
            FMResultSet *set = [db executeQuery:sqlString,key];
            if ([set next]) {
                jsonString = [set stringForColumn:@"value"];
            }
            [set close];
        }];
        
        if (jsonString) {
            NSError *error;
            NSData *data = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
            id value = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
            if (error) {
                NSLog(@"解析json失败getValueByKey");
                return nil;
            }
            return value;
            
        }else{
            return nil;
        }
        
        
        
    }
    

    开放出来的接口

    #import <Foundation/Foundation.h>
    
    @interface YBKeyValueStorage : NSObject
    
    /**
     构造方法
     @param dbName 数据库的名称
     @return 仓库对象
     */
    - (instancetype)initDatabaseWithName:(NSString *)dbName;
    
    /**
     构造方法
     @param dbPath 数据库的路径
     @return 仓库对象
     */
    - (instancetype)initDatabaseWithPath:(NSString *)dbPath;
    
    /**
     创建表
    
     @param tableName 表的名字
     */
    - (void)creatTableWithName:(NSString *)tableName;
    
    /**
     判断表是否在当前数据库
    
     @param tableName 表名称
     @return YES OR NO
     */
    - (BOOL)isTableExistsWithTableName:(NSString *)tableName;
    
    /**
     清空表内容
    
     @param tableName 表名称
     */
    - (void)cleanTableContentWithTableName:(NSString *)tableName;
    
    /**
     删除表
    
     @param tableName 表名称
     */
    - (void)dropTableWithTableName:(NSString *)tableName;
    
    /**
      关闭数据库(释放)
     */
    - (void)close;
    
    /**
     向表中写数据
    
     @param value 值
     @param key 健
     @param tableName 表名称
     */
    - (void)insertValue:(id)value forKey:(NSString *)key intoTable:(NSString *)tableName;
    
    /**
     从表中取数据
    
     @param key 值
     @param tableName 表名称
     @return 值
     */
    - (id)getValueByKey:(NSString *)key fromTable:(NSString *)tableName;
    
    /**
     获取所有数据
    
     @param tableName 表名称
     @return 返回所有数据的数组
     */
    - (NSArray *)getAllValuesFromTable:(NSString *)tableName;
    
    /**
     删除一条数据
    
     @param key 健
     @param tableName 表名称
     */
    - (void)removeValueByKey:(NSString *)key fromTable:(NSString *)tableName;
    
    
    /**
     批量删除表中的数据
    
     @param keys 健
     @param tableName 表名称
     */
    - (void)removeValuesByKeyArray:(NSArray *)keys fromTable:(NSString *)tableName;
    
    @end
    
    
    584E6208-4E70-40DA-8F4F-2C17B48DD66D.png

    demo地址https://github.com/yinbowang/YBKeyValueStorage

    相关文章

      网友评论

        本文标题:iOS - FMDB的二次封装

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