【问题标题】:iPhone CoreData joiniPhone CoreData 加入
【发布时间】: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),它将返回数据。

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

->肯

【问题讨论】:

    标签: sqlite core-data iphone-sdk-3.0


    【解决方案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 方法创建查询时,该方法没有放入所需的引号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-11
      • 2023-03-28
      • 1970-01-01
      • 2016-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      • 2011-05-23
      相关资源
      最近更新 更多