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