WCDB学习之嵌套模型存储

最近项目需要,在找好用的存储框架,然后就找到了WCDB (https://github.com/Tencent/wcdb)。相比于其他的优劣势就不说了,网上分析的很多。下面进入正题嵌套模型如何存储:
例如下面模型Message

@interface Message : NSObject

@property int localID;
@property(retain) NSString *content;
@property(retain) NSString *createTime;
@property(retain) NSString *modifiedTime;
@property (nonatomic, strong) User *user;

@end

Message里面有一个User模型,而我们如果调用insertObject的时候,会崩溃:

-[User encodeWithCoder:]: unrecognized selector sent to instance 0x283a941a0

然后查找文档,


WCDB wiki教程

wiki文档

答案很明显,嵌套模型要实现WCTColumnCoding协议,才可以绑定。
so,
第一步,创建WCTColumnCoding文件模板


创建文件

我绑定的type in dataBase是String类型,因为中间使用了第三方插件YYModel,模型转json字符串最简单方便,各位有其他更好的方法也可以分享出来学习。
创建之后是这样的

#import 
#import 

@interface User (WCTColumnCoding) 
@end

@implementation User (WCTColumnCoding)

+ (instancetype)unarchiveWithWCTValue:(NSString *)value
{
    return /* <#Unarchive User From NSString *#> */;
}

- (NSString *)archivedWCTValue
{
    return /* <#Archive NSString * To User#> */;
}

+ (WCTColumnType)columnTypeForWCDB
{
    return WCTColumnTypeString;
}

@end

那就实现上面的协议方法就行了
存的时候会调用archivedWCTValue,所以在这个时候将模型转化成字符串存进去

- (NSString *)archivedWCTValue
{
    NSString *str = [self yy_modelToJSONString];
    return [NSString stringWithString:str];
}

而取的时候调用的是+ (instancetype)unarchiveWithWCTValue:(NSString *)value方法,所以在这个时候将json字符串转成model:

+ (instancetype)unarchiveWithWCTValue:(NSString *)value
{
    if (value) {
        User *user = [User yy_modelWithJSON:value];
        return user;
    }
    return nil;
}

好了,到此大功告成,运行一下看看结果User有没有存进去
创建模型:

    Message *message = [[Message alloc] init];
    message.isAutoIncrement = YES;
    message.content = @"hello";
    message.user = [User new];
    message.user.name = @"user name";
    [[WCDBManager shareInstance] insertObject:message into:@"WM"];

打印结果


结果

结束!!!
(写的太匆忙,细节上的没怎么写,就写了一下大概流程,有时间以后会补充)

你可能感兴趣的:(WCDB学习之嵌套模型存储)