Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 核心数据-如何从CSV文件中初始化与另一个实体有关系的实体?_Ios_Objective C_Core Data - Fatal编程技术网

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

Ios 核心数据-如何从CSV文件中初始化与另一个实体有关系的实体?,ios,objective-c,core-data,Ios,Objective C,Core Data,在核心数据中,可以使用NSEntityDescription类的insertNewObject:inManagedContext:方法初始化实体。但是,如何初始化与另一个实体有关系的实体 因此,在以下两个CSV文件中: 1, Mike, CA 2, Robinson, MA 3, Peter, CA 4, Bob, NZ 我试图连接的是两个文件的第一列(在本例中是一对一的关系) 我提出了一个想法,首先循环第一个文件的每一行,然后也循环第二个文件的每一行,只有当这两行的第一个数字相互匹配时才创

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

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


1, Mike, CA
2, Robinson, MA
3, Peter, CA
4, Bob, NZ
我试图连接的是两个文件的第一列(在本例中是一对一的关系)

我提出了一个想法,首先循环第一个文件的每一行,然后也循环第二个文件的每一行,只有当这两行的第一个数字相互匹配时才创建新的实体——如果不匹配,则跳到下一个迭代。然而,当我尝试连接两个以上的文件时,这个解决方案要么计算量很大,要么非常复杂-例如,如果我想连接六个文件,而每个文件有3000行,我必须检查3000^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];
        }
   }
文件1的列分别是
n
name
residence
,它们分别是
NSNumber
NSString
NSString

文件2的列为
n
number
age
,它们都是
NSNumber


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

关系实际上只是一个另一个访问器。您
设置两个实体之间的关系。核心数据负责其余部分

假设您有一个名为Person的实体和另一个名为Address的实体。这些实体之间有一个名为
Address
的关系,从Person到Address和
Address
从Address到Person。您可以通过以下方式设置它们之间的关系:

Person *person = ...;
Address *address = ...;
[person setValue:address forKey:@"address"];
该示例使用KVC(键值编码)。如果创建了子类并定义了属性,则还可以执行以下操作:

Person *person = ...;
Address *address = ...;
[person setAddress:address];
反向关系(地址到人)由核心数据自动管理,因此您无需设置反向关系

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

更新 您的示例文件不是代码,所以不,我不能使用它们。发布代码,我们可以进一步讨论这方面

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

更新2 该行应为:

file1entity.n = file2entity;
您正在设置
file1entity
上的
n
file2entity
实例之间的关系。它只是另一个属性访问器,应该被视为相同的属性


请记住,核心数据首先是一个对象图。。将其及其关系视为一个对象图。

我不确定我是否能理解您的意思-这不是我尝试使用循环所做的吗?我也不知道您在
中的意思。您能用我的两个示例文件向我展示一个示例吗(可以随意命名列)?啊,我知道我不应该将
n
属性彼此连接起来-现在修复了我的原始代码。然后返回到我的原始问题:
是进行初始化的更好方法吗?
还是我总是必须使用这些嵌套循环来初始化它?你可以考虑将对象存储在字典中,标识符作为键,并使用n查找字典。这将删除嵌套循环。
file1entity.n = file2entity;