我对Core Data很陌生,如果我只使用sql术语试图更好地解释我的问题,我想提前道歉。我确实在网上搜索,但没有以干净的方式找到答案。 Core Data是否可以加入'两行 - 在搜索时 - 来自同一个实体,它有一些独特的外部' id(不是插入时核心数据提供的ID)。对于exaple,我有一个包含字段的表:
unique_id | description | iso_code
----------------------------------------
13 | some desc | code A
13 | some other stuff | code B
13 | some foo | code C
----------------------------------------
16 | some fun desc | code A
16 | some other stuff | code B
16 | some foo bar | code C
所以每一行都有相同的13或其他ID,我希望"加入"在获取时具有相同id的这类集合,例如按描述对这样的连接结果集进行排序 - 其中iso_code是代码C.然后在表视图中显示结果。
可以在运行时在内存中没有额外的多个数组和字典操作的情况下执行此操作 - 例如,获得3个以上的结果,然后将它们组合到将要显示的简化过滤集合中。或者不再使用一个实体并与之建立关系。
答案 0 :(得分:1)
Core Data不是SQLite的包装器。核心数据不是关系数据库。作为最终结果,Core Data不会进行连接。
核心数据是一种持久对象图。您可以搜索对象图。
您要做的是运行NSFetchRequest
谓词unique_id = 13
,获取实体的三个独立实例并从那里继续处理。您可以在请求上指定排序描述符以实现排序。
您可以自动使用NSFetchedResultsController
将特定请求连接到表格,让您真正只编写特定的视图内容。
(*)尽管SQLite在任何现代应用程序中都是弱链接,因为它具有c.1995单线程特性;当性能调整时,你经常想要强制Core Data自动完成提取而不是故障,因为否则你的主线程最终会被锁定在' background'其他人拥有SQLite锁的活动。显然,取决于您的工作量以及您如何安排线程或队列。
答案 1 :(得分:0)
您的模型中不需要任何唯一ID,因为Core Data会[自动]提供该ID。当您在模型中将实体链接在一起然后生成实体文件时,您将在头文件中找到类似的内容:
@interface User (CoreDataGeneratedAccessors)
- (void)addGoalObject:(Goal *)value;
- (void)removeGoalObject:(Goal *)value;
- (void)addGoal:(NSSet *)values;
- (void)removeGoal:(NSSet *)values;
@end
在上面的示例中,有一个"用户"实体和目标"实体。该模型与这些表相关,但作为程序员提供加入这些表的任何关键字段都不是我的问题,就像在SQL中一样。事实上,Core Data的功能是将模型从数据库中抽象出来,而您的代码对存储数据的格式几乎没有兴趣。因此,核心数据将决定如何处理您正在呼叫的内容"加入"。
当您需要访问给定用户的目标时,您将通过这些访问者方法执行此操作,这些方法允许您通过上述方法调用访问链接到特定用户的各种实体。
这对我来说是一个艰难的过渡,但如果你从未使用过SQL,那么你会感觉更好。它只为你做了所有的事情。如果你尝试使用SQL概念(比如提供唯一的ID),你最终会发现它会产生很多问题并且不会解决任何问题。