VODBCache 2.0.0

VODBCache 2.0.0

TestsTested
LangLanguage Obj-CObjective C
License Custom
ReleasedLast Release Jun 2016

Maintained by Valo Lee.



VODBCache 2.0.0

  • By
  • pozi119

VODBCache(FMDB的数据缓存)

       

  • 本项目包含了 数据缓存(VODBCache), 网络请求缓存(VOURLCache).
  • VOURLCache未经严格测试,慎用,使用CocoaPods不会导入VOURLCache.
  • 以下只针对VODBCache作说明

特别说明(2.0.0)

  • 使用数据库加密功能,只能使用SQLCipher,不能使用系统的sqlite3,否则会出现加密后无法操作数据库的问题.
  • VODBCache会自动导入FMDB和SQLCipher,如果之前导入了 FMDB, 必须将pod 'FMDB'删掉

功能说明(2.0.0):

  • 项目中必须包含FMDB,主要用于缓存网络请求获取的JSON对象
  • 只缓存数字和字符串类型的数据
  • 支持数据的 增 删 改 查
  • 可自动添加新字段(不支持从旧字段更名)
  • 创建数据表时,会自动创建3个字段 vd_primaryKey(唯一性约束), vd_createTime(创建时间), 更新时间(vd_updateTime)
  • 使用vd_classSpec配置关键字,黑白名单,数据版本号等
  • 数据版本为0,1,2...,当版本数字大于旧版时,将删除当前缓存表重新创建.当primaryKey或者修改摸个关键属性名时使用,新增属性时可不使用.
  • 添加FMDB/SQLCipher, 支持对数据库文件加密
  • 添加tablePrefix,用于按用户存储,数据过多时分表

安装

  • Cocoapods导入(会自动导入FMDB):
pod 'VODBCache','2.0.0'
  • 手动导入
    • VODBCache文件夹的所有源码拽入项目
    • 使用Cocoapods或者手动导入FMDB

使用:

  • 在数据模型的.h和需要使用VODBCache源码中包含头文件
#import "VDCache.h"

1.配置 .1) 可不配置vd_myCls,使用spec的代码中会自动设置为当前类名 .2) 每个对象必须要有唯一性约束,所以必须配置vd_classSpec的vd_primaryKey 或者实现- (NSString *)vd_generatePrimaryKey两者之一

+ (VDClassSpec *)vd_classSpec{
    return [VDClassSpec vd_makeClassSpecWithBlock:^(VDClassSpec *spec) {
        spec.vd_primaryKey(@"citycode")     //主键名,将使用此属性的值作为唯一性约束
        .vd_cacheBlackList(@[@"WD",@"WS"]); //黑名单
    }];
}

- (NSString *)vd_generatePrimaryKey{        //配置唯一性约束的另一种方式
    return self.userId;
}

2.增删改查的使用请查看注释. sqlWhere表示SQL语句的Where(查询条件)部分, sqlSort表示SQL语句的ORDER BY(排序)部分,sqlRange表示SQL语句的LIMIT部分

  • 新增单个对象
    BOOL ret = [weather vd_cacheObject];
  • 新增或更新单个对象
    BOOL ret = [weather vd_cacheOrUpdateObject];
  • 新增或更新多个对象
    BOOL ret = [VOWeather vd_cacheOrUpdateOObjects:array];
  • 查询对象
    self.weathers = [VOWeather vd_queryCachedObjectsWhere:nil sort:nil range:NSMakeRange(0, 100)];
  • 根据某种条件删除对象
    NSString *condition = [NSString stringWithFormat:@"\"pinyin\" = \"%@\"",city];
    BOOL ret = [VOWeather vd_deleteCachedObjectsWhere:condition];
  • 删除多个对象
        BOOL ret = [VOWeather vd_deleteCachedObjects:willDelArray];
  • 根据某种条件修改对象
    NSString *condition = [NSString stringWithFormat:@"\"pinyin\" = \"%@\"",city];
    NSString *lTmp = self.lTmpTextField.text;
    NSString *hTmp = self.hTmpTextField.text;
    NSString *tmp  = self.tmpTextField.text;
    NSMutableString *values = [NSMutableString string];
    if (lTmp && lTmp.length > 0) {
        [values appendFormat:@"\"l_tmp\" = \"%@\",",lTmp];
    }
    if (hTmp && hTmp.length > 0) {
        [values appendFormat:@"\"h_tmp\" = \"%@\",",hTmp];
    }
    if (tmp && tmp.length > 0) {
        [values appendFormat:@"\"temp\" = \"%@\",",tmp];
    }
    if (values.length < 2) {
        NSLog(@"No value to modify");
        return;
    }
    [values deleteCharactersInRange:NSMakeRange(values.length - 1, 1)];
     NSString *tableName = NSStringFromClass([VOWeather class]);
    if (VDCache.tablePrefix.length > 0 && ![tableName isEqualToString:NSStringFromClass([VDClassSpec class])]) {
        tableName = [VDCache.tablePrefix stringByAppendingString:tableName];
    }
    NSString *sql = [NSString stringWithFormat:@"UPDATE \"%@\" SET %@ WHERE %@", tableName, values, condition];
    BOOL ret = [VOWeather vd_excuteWithSQL:sql];

3.如运行时候,出现如下错误:

 (19: UNIQUE constraint failed: weather.vd_primaryKey)

此错误说明唯一性冲突,一般可忽略.

4.设置数据库文件加密密钥(2.0.0-beta11):

   [VDCache setEncryptKey:@"123456"];

5.可使用[VDCache setLogErrors:YES];打开关闭数据库调试信息

备注

  • 版本1.0 已经使用在公司的项目中,暂未发现明显问题.
  • 版本2.0 调整了架构和CURD方法,整合了数据库加密功能

欢迎大家多提issue.