Ios CoreData:如何正确设置创建的实体属性

Ios CoreData:如何正确设置创建的实体属性,ios,objective-c,core-data,entity-relationship,entity-attribute-value,Ios,Objective C,Core Data,Entity Relationship,Entity Attribute Value,我有一个核心数据实体,我们称之为“记录”,我有几个属性需要使用来自其他对象/实体的数据进行设置(以及设置关系) 假设“记录”具有以下属性: @interface Record (CoreDataProperties) + (NSFetchRequest<Record *> *)fetchRequest; @property (nullable, nonatomic, copy) NSNumber *superRecordID; @property (nullable, nonat

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

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

@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
@接口记录(CoreDataProperties)
+(NSFetchRequest*)fetchRequest;
@属性(可空、非原子、副本)NSNumber*superRecordID;
@属性(可空、非原子、副本)NSNumber*otherDataID;
@属性(可为空、非原子、副本)NSNumber*活动;
@属性(可空、非原子、副本)NSDate*createDate;
@属性(可空、非原子、副本)NSDate*updateDate;
@属性(可空、非原子、副本)NSString*uuid;
@属性(可空、非原子、保留)SuperRecord*SuperRecord;
@结束
我知道对于active之类的东西,我可以从XCode中将默认值设置为1,对于createDate、updateDate和uuid之类的东西,我可以重写awakeFromInsert方法


我的问题是:在创造时设置其他价值观和关系的最佳实践是什么?我认为唯一可行的方法是创建实例,然后设置所有属性,但是有更好的方法吗?我传入的附加值/对象是参数,并在创建时设置属性/关系?

只需编写一个方便的分配器,如下所示:

- (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似乎是超级唱片的一个属性。不要储存两次。此外,你应该检查一下,你是否需要一个身份证。这不是糟糕的。应将布尔值键入为布尔值。使用
YES
NO
@YES
@NO
代替1和0


键入Safari。

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