【问题标题】:NSPredicate not working with calculated fieldNSPredicate 不适用于计算字段
【发布时间】:2023-03-18 17:42:01
【问题描述】:

我有一个 Core Data 项目,使用简单的计算字段搜索数据时遇到困难,不知道为什么它不起作用。

我有一个 Tutor 实体,具有核心数据字符串属性“tutorFirstName”和“tutorLastName”。我创建了一个附加的字符串属性“tutorFullName”,它填充在一个类别中,如下所示:

NSString *fullName = [@[self.tutorFirstName, self.tutorLastName] componentsJoinedByString:@" "];

数据填充得很好,但是当我执行以下搜索时,只有utorFirstName和tutorLastName上的谓词起作用:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"tutorFirstName = %@", @"Sean"];
[fetchRequest setPredicate:predicate];
NSArray *fetchedObjects = [moc executeFetchRequest:fetchRequest error:&error];
NSLog(@"Search on %@ returned %lu items (%@)",predicate, (unsigned long)fetchedObjects.count, [fetchedObjects objectAtIndex:0]);

predicate = [NSPredicate predicateWithFormat:@"tutorFullName = %@", @"Sean Silverman"];
[fetchRequest setPredicate:predicate];
fetchedObjects = [moc executeFetchRequest:fetchRequest error:&error];
NSLog(@"Search on %@ returned %lu items",predicate, (unsigned long)fetchedObjects.count);

predicate = [NSPredicate predicateWithFormat:@"tutorLastName = %@", @"Silverman"];
[fetchRequest setPredicate:predicate];
fetchedObjects = [moc executeFetchRequest:fetchRequest error:&error];
NSLog(@"Search on %@ returned %lu items (%@)",predicate, (unsigned long)fetchedObjects.count, [fetchedObjects objectAtIndex:0]);

这里是调试代码,显示了每次搜索的结果,以及生成的核心数据对象确实有正确的tutorFullName 条目。

2014-01-21 14:05:26.129 AT Data[54935:70b] Search on tutorFirstName == "Sean" returned 1 items (<Tutor: 0x113b16830> (entity: Tutor; id: 0xd0000000041c0006 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Tutor/p263> ; data: {
charges =     (
    "0xd000000581b40002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p90221>",
    "0xd00000058b280002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p90826>",
    "0xd00000057d4c0002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p89939>",
    "0xd0000005994c0002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p91731>",
    "0xd000000593c40002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p91377>",
    "0xd0000005aa3c0002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p92815>",
    "0xd0000005ab440002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p92881>",
    "0xd0000005aa500002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p92820>",
    "0xd00000057ea00002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p90024>",
    "0xd0000005a7000002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p92608>",
    "(...and 595 more...)"
);
tutorFirstName = Sean;
tutorFullName = "Sean Silverman";
tutorLastName = Silverman;

2014-01-21 14:05:26.130 AT Data[54935:70b] Search on tutorFullName == "Sean Silverman" returned 0 items

2014-01-21 14:05:26.131 AT Data[54935:70b] Search on tutorLastName == "Silverman" returned 1 items (<Tutor: 0x113b16830> (entity: Tutor; id: 0xd0000000041c0006 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Tutor/p263> ; data: {
charges =     (
    "0xd000000581b40002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p90221>",
    "0xd00000058b280002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p90826>",
    "0xd00000057d4c0002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p89939>",
    "0xd0000005994c0002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p91731>",
    "0xd000000593c40002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p91377>",
    "0xd0000005aa3c0002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p92815>",
    "0xd0000005ab440002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p92881>",
    "0xd0000005aa500002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p92820>",
    "0xd00000057ea00002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p90024>",
    "0xd0000005a7000002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p92608>",
    "(...and 595 more...)"
);
tutorFirstName = Sean;
tutorFullName = "Sean Silverman";
tutorLastName = Silverman;

唯一让我觉得奇怪的是,在实体的调试输出中,严格的核心数据属性在字符串值周围没有双引号,但计算属性有(“Sean Silverman”) ,但这可能只是因为计算的属性中有空格。

任何帮助将不胜感激。

【问题讨论】:

    标签: ios core-data nspredicate predicate calculated-field


    【解决方案1】:

    通过计算,我假设您的意思是该属性是瞬态的。如果是这种情况,那么您将无法搜索这些属性。这是因为在对您正在搜索的所有核心数据实体执行搜索时,可能不会创建该属性。来自Core Data Programming Guide(就在清单 1 之后):

    您不能使用基于瞬态属性的谓词进行获取(尽管您可以使用瞬态属性自己在内存中进行过滤)。

    因此,如果您想使用谓词来过滤该属性,则需要使属性非瞬态。

    【讨论】:

    • 同意。致@OP 为什么不简单地对姓名和姓氏使用 AND 运算符?
    • 我试图避免 AND 解决方案,因为我收到了全名,并且在将其解析为第一个和最后一个时会遇到问题,因为有些名称有多个空格(有些是名字,即Mary Jane Smith,其中 Mary Jane 是名字,有些是姓氏,即 Mary Smith Perry,其中 Smith Perry 是姓氏)
    • 好的,我切换到 AND 解决方案并为我的间距问题创建了一个解决方法。我所做的是通过用# 替换任何空格来对名字和姓氏值进行编码,然后在需要打印值时对它们进行解码。只要我的名字中没有一个#,我应该没问题。
    猜你喜欢
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 2022-09-28
    相关资源
    最近更新 更多