【发布时间】:2014-01-29 06:55:19
【问题描述】:
在 Core Data 中,您可以使用 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 数据库中,然后将数据库复制并粘贴(或一些类似的方式)到我的项目中?
我也不知道为什么this answer 说我不必初始化关系部分 - 当我跳过关系属性(并向那些没有关系的属性插入任何值)时,插入不返回任何错误。但是,它存储在 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的列是n、name和residence,分别是NSNumber、NSString、NSString。
file2的列是n、number和age,都是NSNumber。
我想将n 连接为关系。那么我必须在这里迭代整行吗? (其实我意识到这种情况不需要迭代整个部分;因为这是一对一的关系,我可以在检测到匹配的对象时终止外部迭代。但它仍然必须一直迭代每当我想使用一对多或多对多关系时,不是吗?
【问题讨论】:
标签: ios objective-c core-data