iPhone CoreData 加入

Posted

技术标签:

【中文标题】iPhone CoreData 加入【英文标题】:iPhone CoreData join 【发布时间】:2010-03-16 21:21:21 【问题描述】:

这是我的核心数据模型:

我正在尝试从数据库中获取给定 category.categoryName 和 languageset.languageSetName 的所有 LanguageEntries,例如

NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init];

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"LanguageEntry" inManagedObjectContext:del.managedObjectContext];
    [fetchRequest setEntity:entity];

NSString* predicateString = [NSString stringWithFormat:@"Category.categoryName = %@ AND LanguageSet.languageSetName = %@", 
                        @"Food", @"English####Spanish"];

fetchRequest.predicate = [NSPredicate predicateWithFormat:predicateString];

NSError *error = nil;
NSArray* objects = [del.managedObjectContext executeFetchRequest:fetchRequest error:&error];

这总是返回 0 个对象。如果我将谓词字符串设置为匹配一个关系(例如 Category.categoryName = Food 或 languageSet.languageSetName = English####Spanish),它将返回数据。

这真是莫名其妙,谁能解释一下?

->肯

【问题讨论】:

【参考方案1】:

您不能将 Core Data 视为 SQL。 Core Data 中没有“加入”之类的东西。在这种情况下,您试图找到两组对象的交集。在逻辑上接近连接,但不在实现细节中。编程魔鬼总是在细节中。

尝试像这样使用逻辑等号“==”:

@"Category.categoryName == %@ AND LanguageSet.languageSetName == %@"

我相信这会解决您的问题。

数据模型中有一个谓词编辑器隐藏在其中。即使您没有将谓词嵌入模型本身的提取中,它也可以帮助您设置谓词。只需选择一个实体,在您的情况下为“LanguageEntity”,然后添加一个获取请求。将出现编辑谓词,您可以使用对话框创建谓词。它将显示谓词的文本版本,您可以将其复制到代码中。

【讨论】:

对于谓词编辑器(在这种情况下),我会选择“LanguageEntry”作为目的地吗? 对不起,我应该说“添加一个获取请求”。这让你基本上可以构建任何你想要的谓词。您还可以将获取请求保存在模型本身中,这样您就不必手动创建它。但是,当您必须使用变量时,这将失去优势。 single = 可以用在谓词中,这不是问题所在。【参考方案2】:

谓词未正确创建,您必须将参数传递给 predicateWithFormat。应该是:

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"Category.categoryName = %@ AND LanguageSet.languageSetName = %@", 
                                                          @"Food", 
                                                          @"English####Spanish"];

如果您想知道这是做什么的,它会自动在字符串参数周围加上引号,这是在谓词中使用字符串时所必需的。当您使用 NSString 的 format 方法创建查询时,该方法没有放入所需的引号。

【讨论】:

以上是关于iPhone CoreData 加入的主要内容,如果未能解决你的问题,请参考以下文章

将 CoreData 与对象一起使用?

与此上下文的 CoreData SwiftUI 错误不同的 NSManagedObjectModel

谷歌地图 SDK - 核心数据

iphone - coredata 应用程序目录

何时在 iPhone 开发中使用 CoreData

使用 GameKit 通过 NSDictionary 在 iPhone 之间传输 CoreData 数据