iOS - FMDB的二次封装

为了把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 

@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

iOS - FMDB的二次封装_第1张图片
584E6208-4E70-40DA-8F4F-2C17B48DD66D.png

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

你可能感兴趣的:(iOS - FMDB的二次封装)