在 Core Data 中保存一组自定义类

Posted

技术标签:

【中文标题】在 Core Data 中保存一组自定义类【英文标题】:Saving an array of custom classes in Core Data 【发布时间】:2021-01-08 12:18:04 【问题描述】:

我正在尝试将 Core Data 中的自定义类数组保存为可转换属性,但在尝试加载保存的数据时不断收到以下错误:

 NSSecureUnarchiveFromData transformer> threw while decoding a value. (
    NSUnderlyingError = "Error Domain=NSCocoaErrorDomain Code=4864 \"value for key 'NS.objects' was of unexpected class 'MyCustomClass' 

在核心数据模式中,我将转换器设置为“NSSecureUnarchiveFromData”,将自定义类设置为“NSArray”(因为我想保存一个“MyCustomClass”数组)

MyCustomClass.h

@interface MyCustomClass : NSObject <NSSecureCoding>

@property (nonatomic, assign) NSString *identifier;

MyCustomClass.m

@implementation MyCustomClass

+ (BOOL)supportsSecureCoding 
    
    return YES;


- (void)encodeWithCoder:(nonnull NSCoder *)coder 
    
    [coder encodeObject:self.identifier forKey:@"Identifier"];


- (nullable instancetype)initWithCoder:(nonnull NSCoder *)coder 
    
    if (self = [super init]) 
        
        self.identifier = [coder decodeObjectOfClass:[NSString class] forKey:@"Identifier"];
    
    
    return self;

我什至尝试将“MyCustomClass+CoreDataProperties”中的属性声明更改为 NSArray 但得到了同样的错误。

请问我遗漏了哪一步或做错了什么?

【问题讨论】:

【参考方案1】:

我错过了几个步骤。除了问题中的代码之外,还必须执行以下操作才能使其正常工作:

• 将模型编辑器中属性的自定义类更改为 NSArray

• 创建一个名为 MyCustomClassTransformer 的新类:

@interface MyCustomClassTransformer: NSSecureUnarchiveFromDataTransformer 
@end

@implementation MyCustomClassTransformer
+ (Class)transformedValueClass 
    return [MyCustomClassTransformer class];

+ (BOOL)allowsReverseTransformation 
    return YES;


+ (NSArray<Class> *)allowedTopLevelClasses 
    return @[[MyCustomClass class], [NSArray class]];

@end

• 在 AppDelegate 的“didFinishLaunchingWithOptions”中注册新的转换器:

MyCustomClassTransformer *transformer = [[MyCustomClassTransformer new];
[NSValueTransformer setValueTransformer:transformer forName: @"MyCustomClassTransformer"];

【讨论】:

以上是关于在 Core Data 中保存一组自定义类的主要内容,如果未能解决你的问题,请参考以下文章

如何将一组自定义结构保存到 plist swift

Core Data 中带有自定义对象的可转换集合

如何在 Parse 中存储一组自定义对象?

在 Swift 的 Core Data 中保存自定义类

如何为一组自定义分类页面创建可变页面标题

如何从一组自定义字段值中显示 Wordpress 帖子