美文网首页
03 YTKKeyValueStore源码分析

03 YTKKeyValueStore源码分析

作者: lanjing | 来源:发表于2016-10-21 21:39 被阅读105次

    这是个很简单的库,我花了1个小时不到的时间看完了不到400行的源代码和一些issue。

    详细用法看作者的这篇介绍:https://github.com/yuantiku/YTKKeyValueStore。作为持久化的一个方案,却很实用。很常见的一个需求是缓存每次网络请求的内容,用key value的方式再合适不过了。

    其中有两个疑问

    1)库里使用NSJSONSerialization的方式存储数据,磁盘容量使用比较大,作者也没改过来。这个issue里有讨论。https://github.com/yuantiku/YTKKeyValueStore/issues/24

    2)每个操作方法都带有tablename,使用不便,我提了一个issue给作者,实际上,我也在YTKKeyValueStore做了一下简单的封装,将tablename作为实例变量。可以看这个issue:https://github.com/yuantiku/YTKKeyValueStore/issues/34

    原理介绍

    能持久化的对象必须是[NSJSONSerializationdataWithJSONObject]能转化的对象,自定义对象可以通过类似YYModel的库,转换为NSDictionary。所以这个不是问题。

    然后将对象转化为字符串,保存在sqlite数据库中。

    - (void)putObject:(id)object withId:(NSString*)objectId intoTable:(NSString*)tableName {

    if([YTKKeyValueStorecheckTableName:tableName] ==NO) {

    return;

    }

    NSError* error;

    NSData* data = [NSJSONSerializationdataWithJSONObject:objectoptions:0error:&error];

    if(error) {

    debugLog(@"ERROR, faild to get json data");

    return;

    }

    NSString* jsonString = [[NSStringalloc]initWithData:dataencoding:(NSUTF8StringEncoding)];

    NSDate* createdTime = [NSDatedate];

    NSString* sql = [NSStringstringWithFormat:UPDATE_ITEM_SQL, tableName];

    __blockBOOLresult;

    [_dbQueueinDatabase:^(FMDatabase*db) {

    result = [dbexecuteUpdate:sql, objectId, jsonString, createdTime];

    }];

    if(!result) {

    debugLog(@"ERROR, failed to insert/replace into table: %@", tableName);

    }

    }

    - (id)getObjectById:(NSString*)objectId fromTable:(NSString*)tableName {

    YTKKeyValueItem* item = [selfgetYTKKeyValueItemById:objectIdfromTable:tableName];

    if(item) {

    returnitem.itemObject;

    }else{

    returnnil;

    }

    }

    - (YTKKeyValueItem*)getYTKKeyValueItemById:(NSString*)objectId fromTable:(NSString*)tableName {

    if([YTKKeyValueStorecheckTableName:tableName] ==NO) {

    returnnil;

    }

    NSString* sql = [NSStringstringWithFormat:QUERY_ITEM_SQL, tableName];

    __blockNSString* json =nil;

    __blockNSDate* createdTime =nil;

    [_dbQueueinDatabase:^(FMDatabase*db) {

    FMResultSet* rs = [dbexecuteQuery:sql, objectId];

    if([rsnext]) {

    json = [rsstringForColumn:@"json"];

    createdTime = [rsdateForColumn:@"createdTime"];

    }

    [rsclose];

    }];

    if(json) {

    NSError* error;

    idresult = [NSJSONSerializationJSONObjectWithData:[jsondataUsingEncoding:NSUTF8StringEncoding]

    options:(NSJSONReadingAllowFragments)error:&error];

    if(error) {

    debugLog(@"ERROR, faild to prase to json");

    returnnil;

    }

    YTKKeyValueItem* item = [[YTKKeyValueItemalloc]init];

    item.itemId= objectId;

    item.itemObject= result;

    item.createdTime= createdTime;

    returnitem;

    }else{

    returnnil;

    }

    }

    相关文章

      网友评论

          本文标题:03 YTKKeyValueStore源码分析

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