美文网首页数据存储
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

相关文章

  • JRDB:iOS对FMDB的超好用封装

    JRDB:iOS对FMDB的超好用封装 JRDB:iOS对FMDB的超好用封装

  • FMDB二次封装工具类,让你快速高效集成数据库

    FMDB二次封装工具类,让你快速高效集成数据库 ios.jobbole.com/89403/

  • SQLite数据库框架--FMDB

    FMDB概述 什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite...

  • SYCacheManager缓存数据操作

    SYCacheManager使用FMDB、LKDB进行二次封装,缓存数据。 FMDB的基本使用使用FMDataba...

  • FMDB学习

    FMDB简介 FMDB是什么 FMDB是iOS平台的SQLite数据库框架,它用object-c封装了SQLite...

  • SQLite数据库框架之FMDB(Swift)

    FMDB使用 FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API ...

  • FMDB

    # FMDB基本使用 FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言...

  • 2019-06-13

    FMDB介绍 FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API ...

  • FMDB

    FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API FMDB的优点...

  • swift FMDB使用

    FMDB特性: FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API...

网友评论

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

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