Core data 添加<;键>;对象与insertNewObjectForEntityForName核心数据关系
嗨 虽然我在数据库开发方面有很多经验,但我很难概念化核心数据中的链接关系。据我所知,多关系是附加到一个文件的NSSet。在阅读了文档之后,我理解了其中的一部分,并在下面的代码中的第一次导入中使用了它 我有一个数据模型,使用XMLParser执行两个单独的导入。第一次导入从同一导入中的同一XML文件加载事件和类别,如下所示:Core data 添加<;键>;对象与insertNewObjectForEntityForName核心数据关系,core-data,import,entity-relationship,one-to-many,key-value-coding,Core Data,Import,Entity Relationship,One To Many,Key Value Coding,嗨 虽然我在数据库开发方面有很多经验,但我很难概念化核心数据中的链接关系。据我所知,多关系是附加到一个文件的NSSet。在阅读了文档之后,我理解了其中的一部分,并在下面的代码中的第一次导入中使用了它 我有一个数据模型,使用XMLParser执行两个单独的导入。第一次导入从同一导入中的同一XML文件加载事件和类别,如下所示: if (thisTagIsForOneTable) { // Insert object for the one-entity (Events)
if (thisTagIsForOneTable) {
// Insert object for the one-entity (Events)
self.eventsObject = [NSEntityDescription insertNewObjectForEntityForName:@"Events" inManagedObjectContext:xmlManagedObjectContext];
return;
}
if (thisTagIsForManyTable) {
// Insert object for many-entity (EventCategories)
self.categoriesObject = [NSEntityDescription insertNewObjectForEntityForName:@"EventCategories" inManagedObjectContext:xmlManagedObjectContext];
return;
}
......
// Set attribute values depending upon whether the tag is for the one-entity or the many-entity.
[self.xxxObject setValue:trimmedString forKey:attributeName];
......
// Set the relationship. This works great!
if (thisTagIsForManyTable) {
NSMutableSet *manyRecordSet = [self.eventsObject mutableSetValueForKey:@"categories"]; // My relationship name.
[manyRecordSet addObject:self.categoriesObject];
}
// Save the context. Voila.
以上方法很好。第二次导入分别在应用程序的不同部分加载EventLocations,因此我需要将其设置为与事件的一个关系。这就是我不太确定的地方。这些步骤应该是什么
// Step A) Create (insert) new EventLocations object.
self.eventLocationsObject = [NSEntityDescription insertNewObjectForEntityForName:@"EventLocations" inManagedObjectContext:xmlManagedObjectContext];
// Step B) Locate and get a reference to the the related one-entity's object (Events) by ID? I have a custom class for Events.
// This seems to work but I'm taking a performance hit and getting a compiler warning below. The method returnObjectForEntity does a query and returns an NSManagedObject. Is this correct?
Events *event = (Events *)[self returnObjectForEntity:@"Events" withID:[oneRecordObject valueForKey:@"infIDCode"]];
// Step C) Set the relationship to the Events entity.
if (event) {
[event addLocationsObject:self.eventLocationsObject];
// Compiler warning: incompatible Objective-C types 'struct NSManagedObject *', expected 'struct EventLocations *' when passing argument 1 of 'addLocationsObject:' from distinct Objective-C type
}
// Save the context.
我对步骤B和C不太确定。任何帮助都将不胜感激。谢谢。步骤B:请告诉我们编译器警告。 为了加快速度,您可以在开始导入之前创建一个缓存(NSDictionary),其中包含所有事件及其@“infIDCode”作为键。只要您能够确保在导入阶段中不添加/删除/更改任何事件,这将加快速度 步骤C: self.eventLocationsObject可能应该声明为EventLocations*
一般来说,您的导入应该是这样工作的步骤B:请告诉我们编译器警告。 为了加快速度,您可以在开始导入之前创建一个缓存(NSDictionary),其中包含所有事件及其@“infIDCode”作为键。只要您能够确保在导入阶段中不添加/删除/更改任何事件,这将加快速度 步骤C: self.eventLocationsObject可能应该声明为EventLocations*
通常,您的导入应该以这种方式工作编译器警告在步骤C:OK中。只是为了更好地理解这一点:我正在做的是在实体中插入一个新对象(步骤A),然后将该对象添加到一个实体关系中的集合中(步骤C)?我对步骤C的评论应该修复编译器警告。是,将新对象添加到上下文中,然后根据需要将其添加到关系(集合)中编译器警告在步骤C:确定中。只是为了更好地理解这一点:我正在做的是在实体中插入一个新对象(步骤A),然后将该对象添加到一个实体关系中的集合中(步骤C)?我对步骤C的评论应该修复编译器警告。是,将新对象添加到上下文中,然后根据需要将其添加到关系(集合)