核心数据 - 如何初始化与CSV文件与另一个实体有关系的实体



在核心数据中,您可以使用NSEntityDescription类的insertNewObject: inManagedContext:方法初始化实体。但是,如何初始化与另一个实体有关系的实体?

因此,在以下两个CSV文件中:


1, Mike, CA
2, Robinson, MA
3, Peter, CA
4, Bob, NZ

1, 2, 20
2, 2, 23
3, 2, 22
4, 1, 32

我要连接的是两个文件的第一列(在这种情况下,一对一关系)。

我想到了一个想法,即您首先循环在第一个文件的每一行上,并且您还循环在第二个文件的每一行上,并且仅当这两行的第一行相互匹配时,才创建新实体 - 并跳过下一次迭代。但是,当我尝试连接两个以上的文件时,该解决方案要么在计算重量上进行重量,要么是相当令人费解的 - 例如,如果我想连接六个文件并且每个文件都有3,000行,则必须检查条件3,000^6次。<<<<<<

那么,这是进行初始化的更好方法吗?由于某些原因,我到目前为止阅读的每个示例都使用其实体中的关系已经完成了这些初始化,并且直接使用了SQLITE数据库 - 因此,也许不可能从代码内部进行初始化,我应该做的是首先存储这些CSV数据到SQLITE数据库,然后将数据库复制和粘贴到我的项目中?

我也不知道为什么这个答案说我不必初始化关系部分 - 当我跳过关系属性(并将任何值插入没有关系的属性)时,插入就不返回任何错误。但是,它已将nil存储到,因此我无法在代码中完全连接这两个实体,对

我使用iOS 7和xcode 5。

[更新]

假设File1和File2都由NSString组成:


for (NSString *row in file1) {
    NSArray *line = [row componentsSepareatedByString:@","];
    File1Entity *file1entity = [NSEntityDescription insertNewObjectForEntityForName:@"File1Entity" inManagedObjectContext:_managedObjectContext];
    for (NSString *row2 in file2) {
        NSArray2 *line2 = [row2 componentsSeparatedByString:@","];
        if (line[0] isEqualToString: line2[0]) {
            File2Entity *file2entity = [NSEntityDescription insertNewObjectForEntityForName:@"File2Entity" inManagedObjectContext:_managedObjectContext];
            file1entity.name = line[1]
            file1entity.residence = line[2]
            file2entity.number = line2[1]
            file2entity.age = line2[2]
            file1entity.n = file2entity
            NSError *err;
            [_managedObjectContext save:&err];
        }
   }

file1的列分别为 nnameresidence,分别为 NSNumberNSStringNSString

File2的列是nnumberage,所有这些都是NSNumber

我想将两个n连接为关系。那么,我必须在这里迭代整个行吗?(实际上,我意识到这种情况不需要迭代整个部分;因为这是一对一的关系,所以当我检测到匹配的对象时,我可以终止外迭代。但是,它仍然必须在整个时间内进行迭代每当我想使用一对多或多一到多的关系时,不是吗?

一种关系实际上只是另一个访问者。您set两个实体之间的关系。核心数据照顾其余的。

想象您有一个叫人的实体,另一个称为地址。这些实体具有从人到地址的人为地址的address的关系,而address从地址到人。您可以通过:

来设置它们之间的关系
Person *person = ...;
Address *address = ...;
[person setValue:address forKey:@"address"];

该示例使用KVC(键值编码)。如果您创建了子类,并且定义了属性,则也可以这样做:

Person *person = ...;
Address *address = ...;
[person setAddress:address];

逆关系(与人的地址)由核心数据自动管理,因此您不需要设置倒数。

至于您设置这种关系时,这完全取决于您和应用程序的设计。

更新

您的示例文件不是代码,所以不,我不能使用它们。邮政编码,我们可以进一步讨论该方面。

...是您放置已经知道如何做的代码的地方。创建实体。我发布的示例向您展示了如何设置关系这是您所问的。

更新2

所讨论的行应该阅读:

file1entity.n = file2entity;

您将nfile1entity上的关系设置为file2entity实例。它只是另一个物业登录机,应对其进行相同的处理。

记住,核心数据是对象图首先。对待它及其关系,好像它是对象图。

最新更新