最近项目需要,在找好用的存储框架,然后就找到了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
然后查找文档,
答案很明显,嵌套模型要实现WCTColumnCoding协议,才可以绑定。
so,
第一步,创建WCTColumnCoding文件模板
我绑定的type in dataBase是String类型,因为中间使用了第三方插件YYModel,模型转json字符串最简单方便,各位有其他更好的方法也可以分享出来学习。
创建之后是这样的
#import <Foundation/Foundation.h>
#import <WCDB/WCDB.h>
@interface User (WCTColumnCoding) <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"];
打印结果
结束!!!
(写的太匆忙,细节上的没怎么写,就写了一下大概流程,有时间以后会补充)