Skip to content

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

自定义类需要支持字段映射并不复杂,只需实现 WCTColumnCoding 协议皆可,以下是协议的原型:

@protocol WCTColumnCoding
@required
+ (nullable instancetype)unarchiveWithWCTValue:(nullable WCTValue *)value;
- (nullable WCTValue *)archivedWCTValue;
+ (WCTColumnType)columnType;
@end

WCTValue 为该类在数据库中存储的形式。例如,整型可以以 Int64 的形式存储。NSDate 既可以以时间戳 double 的形式存储,也可以以 JSON 序列化后 NSData 的形式存储。这需要开发者自行确定。 而 archivedWCTValueunarchiveWithWCTValue: 实际上就是序列化和反序列化的过程。

以上述的 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

在弹出的菜单中依次

  1. 输入文件名
  2. 选择 Language 为 Objective-C
  3. 选择对应的基础类型
Clone this wiki locally