ios - NSPredicate 不适用于计算字段

标签 ios core-data nspredicate predicate calculated-field

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

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

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

数据填充良好,但当我执行以下搜索时,只有 tutorFirstName 和 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”) ,但这可能只是因为计算属性中有一个空格。

如有任何帮助,我们将不胜感激。

最佳答案

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

You cannot fetch using a predicate based on transient properties (although you can use transient properties to filter in memory yourself).

因此,如果您想使用谓词来过滤该属性,您需要将属性设置为非 transient 。

关于ios - NSPredicate 不适用于计算字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21267229/

相关文章:

objective-c - 使用NSPredicate过滤核心数据中的对象

ios - 如何根据 UIAlertController 中的 UITextField 禁用 UIAlertAction?

ios - 我不明白为什么当应用程序崩溃时我收到此消息......?

ios - 如何使用 Eureka 设计自定义 PickerInlineRow

swift - 在 Swift 中对数组对象使用谓词会返回错误

ios - 如何将 NSPredicate 与多维数组一起使用(其中 predicateFormat 存在于 valueForKeyPath 中)

ios - Xcode 中奇怪的编译器警告

ios - 调用核心数据操作时崩溃并显示 "failed to scene-update in time"消息

ios - 未保存的管理对象上下文对包含NONE或ANY的谓词产生异常

ios - Swift & Core Data - 将实体添加到现有实体