Objective c CoreData-“数据中心”;加入;来自同一实体的行
我对核心数据非常陌生,如果我只是为了更好地解释我的问题而使用sql术语,我想提前道歉。我确实在网上搜索了一下,但没有以一种干净的方式找到答案。核心数据是否可能在搜索时从具有唯一“外部”id(不是核心数据在插入时提供的id)的同一实体“连接”两行。例如,我有一个表包含字段:Objective c CoreData-“数据中心”;加入;来自同一实体的行,objective-c,core-data,Objective C,Core Data,我对核心数据非常陌生,如果我只是为了更好地解释我的问题而使用sql术语,我想提前道歉。我确实在网上搜索了一下,但没有以一种干净的方式找到答案。核心数据是否可能在搜索时从具有唯一“外部”id(不是核心数据在插入时提供的id)的同一实体“连接”两行。例如,我有一个表包含字段: unique_id | description | iso_code ---------------------------------------- 13 | some desc |
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
因此,每一行都有相同的id 13或其他,我希望在获取时“连接”这些相同id的集合,例如,根据描述对这些连接的结果集进行排序,例如,其中iso_代码是代码C。然后在表视图中显示结果
在运行时无需在内存中进行额外的多个数组和字典操作,就可以做到这一点-例如,多获得3倍的结果,然后将它们组合到将显示的精简筛选集合中。或者不使用一个或多个实体并与其创建关系。核心数据不是SQLite的包装。核心数据不是关系数据库。因此,核心数据不会进行连接 核心数据是一个持久对象图。您可以搜索对象图 您要做的是运行一个带有
unique\u id=13
谓词的NSFetchRequest
,从中获取实体的三个独立实例并继续处理。您可以在请求上指定排序描述符以实现排序
您可以使用NSFetchedResultsController
自动将特定请求连接到表,这样您实际上只需编写特定的视图内容
编辑:至于您的其他关注点,核心数据有一个相当高级的内存管理系统,其中对象从普通故障(如果您的持久存储是SQLite,则基本上只是一个表名+行号)扩展,仍然是故障,但它们的信息在核心数据的缓存中(SQLite不是多线程的,核心数据是,所以它会进行一些中间结果缓存)或完全存在于内存中(即,直接连接到对象的所有字段)。核心数据将根据需要自动进入存储,以在状态*之间转换
(*)虽然SQLite在任何现代应用程序中都是非常薄弱的一环,因为它具有c.1995单线程的特性;但在性能调整时,您通常希望强制核心数据执行完整的获取,而不是自动出错,因为否则您的主线程可能会像其他人拥有SQLite锁一样锁定在“后台”活动上。具体取决于当然,这取决于您的工作负载以及您如何安排线程或队列。您的模型中不需要任何唯一的id,因为核心数据将[自动]提供该id。当您将模型中的实体链接在一起,然后生成实体文件时,您会在头文件中找到如下内容:
@interface User (CoreDataGeneratedAccessors)
- (void)addGoalObject:(Goal *)value;
- (void)removeGoalObject:(Goal *)value;
- (void)addGoal:(NSSet *)values;
- (void)removeGoal:(NSSet *)values;
@end
在上面的例子中,有一个“用户”实体和一个“目标”实体。模型将这些表关联起来,但作为程序员,我的问题不是像在SQL中那样提供连接这些表的任何关键字段。事实上,核心数据的功能是将模型从数据库中抽象出来,您的代码实际上对数据存储的格式不感兴趣。因此,核心数据将决定如何处理你所谓的“加入”
当您需要访问给定用户的目标时,您将通过这些访问器方法来访问,这些方法允许您通过上面的方法调用访问链接到特定用户的各种实体
这对我来说是一个艰难的转变,但如果你从来没有使用过SQL,你会过得更好。它只是为你做了所有这些事情。如果你尝试使用SQL概念(比如提供唯一ID),你最终会发现它产生了太多问题,却没有解决任何问题