加入没有任何定义关系的核心数据实体

Posted

技术标签:

【中文标题】加入没有任何定义关系的核心数据实体【英文标题】:Join in Core Data entities without any defined relationship 【发布时间】:2015-02-07 05:12:31 【问题描述】:

我的核心数据数据库中有两个实体 Product 和 Variant,但没有定义任何关系。我正在从一些 Web 服务的表中添加数据。这些表将 prodct_id 作为公共列,我想将其用作关系。

我想按照以下查询获取数据:

select * from Product, Variant where Product.product_id = Variant.product_id

我是核心数据的新手,如何获得所需的数据?

【问题讨论】:

有理由不添加关系吗? 如果你需要做那种查询,你应该直接使用SQLite。 Core Data 的 API 不同于 SQL 查询。 【参考方案1】:

CoreData 与关系数据库并不完全相同,因此没有简单的方法可以做到这一点。

我的解决方案是使用NSPredicate首先检索所有唯一的product_id,然后使用这些product_id获取所有ProductVariant,最后将它们与代码配对。

NSEntityDescription *productEntity;
NSEntityDescription *variantEntity;

fetchRequest.resultType = NSManagedObjectResultDictionary;
fetchRequest.propertiesToFetch = [NSArray arrayWithObject:[[variantEntity propertiesByName] objectForKey:@"product_id"]];
fetchRequest.returnsDistinctResults = YES;

NSArray *productIDDictionaryArray = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil];
NSArray *productIDArray = [productIDDictionaryArray valueForKey:@"product_id"]; //this is magic

NSFetchRequest *productFetch = [[NSFetchRequest alloc] init];
[productFetch setEntity:productEntity]
[productFetch setPredicate: [NSPredicate predicateWithFormat: @"(product_id IN %@)", productIDArray]];
NSError *error;
NSArray *products = [MOC
        executeFetchRequest:productFetch error:&error];

NSFetchRequest *variantFetch = [[NSFetchRequest alloc] init];
[variantFetch setEntity:variantEntity]
[variantFetch setPredicate: [NSPredicate predicateWithFormat: @"(product_id IN %@)", productIDArray]];
NSError *error;
NSArray *variants = [MOC
        executeFetchRequest:variantFetch error:&error];

//pair product and variants with the same product_id using code

【讨论】:

以上是关于加入没有任何定义关系的核心数据实体的主要内容,如果未能解决你的问题,请参考以下文章

iOS核心数据:存储与不同实体中任何NSManagedObject的关系

核心数据。加入 2 个具有多对多关系的表?

核心数据:有没有办法使用隐含关系而不是真实关系来有效地查询模型?

如果这些表之间没有关系,我该如何加入2个实体表?

最近的搜索结果加入核心数据

核心数据:在两个实体中查找的 NSPredicate