-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Objc 自定义字段映射类型
Qiuwen-chen edited this page Mar 28, 2023
·
1 revision
在模型绑定一章中,已经介绍了模型绑定及其内建支持的类型。对于不支持的类,则无法进行字段映射,读写的时候会crash或报错。
@interface MyClass : NSObject
@property(nonatomic, assign) int variable1;
@property(nonatomic, assign) int variable2;
@end
@implementation MyClass
@end
@interface Sample : NSObject<WCTTableCoding>
@property(nonatomic, strong) MyClass* myObject;
WCDB_PROPERTY(myObject)
@end
@implementation Sample
WCDB_IMPLEMENTATION(Sample)
WCDB_SYNTHESIZE(myObject)
@end
而本章将介绍开发者如何进行自定义字段映射类型,同时还将提供文件模版和代码模版以简化定义的操作。
自定义类需要支持字段映射并不复杂,只需实现 WCTColumnCoding
协议皆可,以下是协议的原型:
@protocol WCTColumnCoding
@required
+ (nullable instancetype)unarchiveWithWCTValue:(nullable WCTValue *)value;
- (nullable WCTValue *)archivedWCTValue;
+ (WCTColumnType)columnType;
@end
WCTValue
为该类在数据库中存储的形式。例如,整型可以以 Int64
的形式存储。NSDate
既可以以时间戳 double
的形式存储,也可以以 JSON 序列化后 NSData
的形式存储。这需要开发者自行确定。
而 archivedWCTValue
和 unarchiveWithWCTValue:
实际上就是序列化和反序列化的过程。
以上述的 MyClass
为例,可以以 JSON 的方式对其进行存储,并支持字段映射。JSON 的输出为 Data
,因此其可以实现为:
// 错误示例,请勿参照
@interface MyClass : NSObject<WCTColumnCoding>
@property(nonatomic, assign) int variable1;
@property(nonatomic, assign) int variable2;
@end
@implementation MyClass
+ (WCTColumnType)columnType {
return WCTColumnTypeData;
}
- (nullable WCTValue *)archivedWCTValue {
NSDictionary *dict = @{@"variable1":@(_variable1),
@"variable2":@(_variable2)};
return [NSJSONSerialization dataWithJSONObject:dict options:0 error:NULL];
}
+ (nullable instancetype)unarchiveWithWCTValue:(nullable WCTValue *)value {
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:value.dataValue options:0 error:NULL];
MyClass* newObj = [[MyClass alloc] init];
newObj.variable1 = [[json objectForKey:@"variable1"] intValue];
newObj.variable2 = [[json objectForKey:@"variable2"] intValue];
return newObj;
}
@end
自定义字段映射类型中,有部分是格式固定的代码,因此,WCDB 提供了文件模版和代码模版两种方式,以简化操作。
文件和代码模版都在源代码的 tools/templates
目录下,链入 WCDB 时会自动安装。
文件模版安装完成后,在 Xcode 的菜单 File
-> New
-> File...
中创建新文件,选择 ColumnCodable
。
在弹出的菜单中依次
- 输入文件名
- 选择 Language 为 Objective-C
- 选择对应的基础类型
- 欢迎使用 WCDB
- 基础教程
- 进阶教程
- 欢迎使用 WCDB
- 基础教程
- 进阶教程
- 欢迎使用 WCDB
- 基础教程
- 进阶教程
- 欢迎使用 WCDB
- 基础教程
- 进阶教程