iOS - 核心数据 - 保存包含对象数组的对象

Posted

技术标签:

【中文标题】iOS - 核心数据 - 保存包含对象数组的对象【英文标题】:iOS - Core Data - Saving an object that contains an array of Objects 【发布时间】:2015-08-16 18:27:46 【问题描述】:

我刚刚开始使用 Core data,(我也在尝试使用 Magical Record)。我正在创建一个非常简单的付款跟踪应用程序。

我想保存一个包含债务人数组的 Payment 对象。这就是我的 Payment 对象的样子

@class Debtor;

@interface Payment : NSObject
@property (strong, nonatomic) NSString *paymentAmountString;
@property (strong, nonatomic) NSString *titleString;
@property (strong, nonatomic) NSArray *debtorsArray;
@property (strong, nonatomic) NSDate *dueDate;
@property (strong, nonatomic) NSString *notesString;
@end

debtorsArray 是一个 Debtor 对象数组

@interface Debtor : NSObject
@property (strong, nonatomic) NSString *nameString;
@property (strong, nonatomic) NSString *amountOwedString;

我应该如何保存这个对象,因为它包含一个数组。我是否需要创建两个不同的实体,以及付款和债务人之间的关系?我该怎么做,如何确保正确获取它们?

【问题讨论】:

debtorsArray 究竟包含什么?它们可以如何序列化。然后你可以使用可转换类型。 这是一个债务人对象数组,我用那个债务人对象更新了我的帖子 请在下面查看我的回答,如果它适合您,请接受。谢谢。 【参考方案1】:

只为Payment 创建一个实体。您必须在此实体中为属性 debtorsArray 使用“Transformable”数据类型。

然后在您的Debtor 类中实现以下方法:

- (void)encodeWithCoder:(NSCoder *)aCoder
    [aCoder encodeObject:self.nameString forKey:@"nameString"];
    [aCoder encodeObject:self.amountOwnedString forKey:@"amountOwnedString"];


-(id)initWithCoder:(NSCoder *)aDecoder
    if(self = [super init])
        self.nameString = [aDecoder decodeObjectForKey:@"nameString"];
        self.amountOwnedString = [aDecoder decodeObjectForKey:@"amountOwnedString"];
    
    return self;

应该像任何其他获取查询一样正常获取实体。

希望这会有所帮助。

【讨论】:

我是否有理由使用它而不是一对多关系? 我认为这实际上取决于您的数据大小。如果我的数据很大,我倾向于避免创建多个嵌套实体。这样我可能会节省一些额外的实体调用和获取请求。我觉得这种方式更简单。 我会试一试,虽然我个人还不能确认它是否有效,但我仍然需要弄清楚如何使用 Magical Record 进行保存和获取。 @Andy 当然!我可以确认这可以正常工作,因为我在项目中将它用于完全相同的情况:) 但我会等待您的确认。只是问一下,你所说的神奇唱片到底是什么意思? Magical Record,简化核心数据。

以上是关于iOS - 核心数据 - 保存包含对象数组的对象的主要内容,如果未能解决你的问题,请参考以下文章

iOS,Swift:如何保存包含自定义对象的数组以便我可以加载以供重用?

ios核心数据:如何更改NSManagedObject而不将其保存到上下文中

将对象保存在核心数据中(字符串属性,双精度数组)

ios核心数据未保存

核心数据对象无效

将子实体加载到核心数据中的托管对象