【问题标题】:CoreData: How to properly set created entity attributesCoreData:如何正确设置创建的实体属性
【发布时间】:2018-02-19 23:18:00
【问题描述】:

我有一个核心数据实体,我们称之为“记录”,我有几个属性需要使用来自其他对象/实体的数据进行设置(以及设置关系)。

假设“记录”具有以下属性:

@interface Record (CoreDataProperties)

+ (NSFetchRequest<Record *> *)fetchRequest;

@property (nullable, nonatomic, copy) NSNumber *superRecordID;
@property (nullable, nonatomic, copy) NSNumber *otherDataID;
@property (nullable, nonatomic, copy) NSNumber *active;
@property (nullable, nonatomic, copy) NSDate *createDate;
@property (nullable, nonatomic, copy) NSDate *updateDate;
@property (nullable, nonatomic, copy) NSString *uuid;
@property (nullable, nonatomic, retain) SuperRecord *superRecord;

@end

我知道对于诸如活动之类的东西,我可以在 XCode 中将默认值设置为 1,而对于诸如 createDate、updateDate 和 uuid 之类的东西,我可以覆盖 awakeFromInsert 方法。

我的问题是:在创建时设置其他价值观和关系的最佳做法是什么?我能想到我知道应该工作的唯一方法是创建实例然后设置所有属性,但是有没有更好的方法可以做到这一点?我在哪里传递附加值/对象是参数并在创建时设置属性/关系?

【问题讨论】:

    标签: ios objective-c core-data entity-relationship entity-attribute-value


    【解决方案1】:

    只需像这样编写一个便利分配器:

    - (instancetype)initWithSuperRecord:(SuperRecord*)superRecord active:(BOOL)active … context:(NSManagdObjectContext*)context
    {
      self = [super initWithEntity:… /* in subclasses you typically know that */ 
                    insertIntoManagedObjectContext:context];
      if( self ) 
      {
         // Set the properties you get from the args
      }
      return self;
    }
    
    + (instancetype)newWithSuperRecord:(SuperRecord*)superRecord active:(BOOL)active … context:(NSManagdObjectContext*)context
    {
       return [[self alloc] initWithSuperRecord:superRecord … context:context];
    }
    

    一些建议:superID 似乎是 super 记录的一个属性。不要存储两次。此外,您应该检查您是否需要身份证。这不是 OOPish。布尔值应键入布尔值。使用YESNO@YES@NO 而不是1 和0。

    在 Safari 中输入。

    【讨论】:

    • 您对 ID 字段的看法是绝对正确的,我的前任试图使表与我们的 webDB 保持一致,但对象本身更符合 OOP 原则。我选择避免走这条路,因为我曾与一位高级开发人员交谈过,他建议我避免弄乱 init 方法,因为 Core Data 在幕后做了很多我可能会干扰的事情。我决定只创建对象并在之后设置属性。但是,我实施了您的解决方案,它按预期工作,因此您将标记您的答案正确。非常感谢您的帮助!
    • 你可以那样做,没有错。但是,我对您的高级开发人员有一个建议 ;-) 即使 CD 也做了很多幕后的事情,Objective-C 的优势在于初始化不是语言概念。它完全在语言之外。您在 Objective-C 中学到的关于初始化的知识不是由语言本身定义的,而是由框架定义的。
    • 因此,初始化代码只是带有一些框架规则的普通代码(仍然不是语言)。初始化在其幕后没有任何作用。因此-init… 中的代码是普通 代码。将外部代码放入初始化程序不会改变任何内容,它仍然是常规代码。所以你在初始化之外的代码和你在初始化里面的代码是完全一样的,不会对聚光灯下或幕后的任何东西造成伤害。 CD 甚至不知道消息是来自常规代码还是来自初始化程序,因为没有区别。
    • 因此,您的高级开发人员的建议也可能是:“不要在名为 setUpEntity 甚至 -doSomething 的方法中移动用于设置属性的代码,因为“CD 会做一些事情幕后”。这有什么关系?他不会说。但-init…只是另一个-doSomething
    • 实际上我意识到 superRecordID 字段在那里所以我有一种方法可以在我进行映射时将对象连接在一起,所以这是必要的。将 bool 属性设置为 NSNumber 的也是核心数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多