最近項目需要神凑,在找好用的存儲框架象浑,然后就找到了WCDB (https://github.com/Tencent/wcdb)旭等。相比于其他的優(yōu)劣勢就不說了窖铡,網(wǎng)上分析的很多疗锐。下面進入正題嵌套模型如何存儲:
例如下面模型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模型,而我們?nèi)绻{(diào)用insertObject的時候费彼,會崩潰:
-[User encodeWithCoder:]: unrecognized selector sent to instance 0x283a941a0
然后查找文檔滑臊,
答案很明顯,嵌套模型要實現(xiàn)WCTColumnCoding協(xié)議箍铲,才可以綁定简珠。
so,
第一步虹钮,創(chuàng)建WCTColumnCoding文件模板
我綁定的type in dataBase是String類型聋庵,因為中間使用了第三方插件YYModel,模型轉(zhuǎn)json字符串最簡單方便芙粱,各位有其他更好的方法也可以分享出來學(xué)習(xí)祭玉。
創(chuàng)建之后是這樣的
#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
那就實現(xiàn)上面的協(xié)議方法就行了
存的時候會調(diào)用archivedWCTValue,所以在這個時候?qū)⒛P娃D(zhuǎn)化成字符串存進去
- (NSString *)archivedWCTValue
{
NSString *str = [self yy_modelToJSONString];
return [NSString stringWithString:str];
}
而取的時候調(diào)用的是+ (instancetype)unarchiveWithWCTValue:(NSString *)value方法春畔,所以在這個時候?qū)son字符串轉(zhuǎn)成model:
+ (instancetype)unarchiveWithWCTValue:(NSString *)value
{
if (value) {
User *user = [User yy_modelWithJSON:value];
return user;
}
return nil;
}
好了脱货,到此大功告成,運行一下看看結(jié)果User有沒有存進去
創(chuàng)建模型:
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"];
打印結(jié)果
結(jié)束B梢獭U窬!
(寫的太匆忙择份,細(xì)節(jié)上的沒怎么寫扣孟,就寫了一下大概流程,有時間以后會補充)