NSPredicate不能使用计算字段

我有一个核心数据项目,难以用简单的计算字段search数据,不知道为什么它不工作。

我有一个导师实体,核心数据string属性“tutorFirstName”和“tutorLastName”。 我已经创build了一个额外的string属性“tutorFullName”,这是填充在一个类别中,如下所示:

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

数据填充良好,但是当我执行以下search时,只有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]); 

以下是显示每个search结果的debugging代码,以及生成的核心数据对象DOES具有正确的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; 

唯一让我感到奇怪的是,在实体的debugging输出中,严格的核心数据属性没有围绕string值的双引号,而是计算的属性(“Sean Silverman”),但是可能只是因为在计算属性中有一个空格。

任何帮助将不胜感激。

通过计算,我假设你的意思是财产是暂时的。 如果是这种情况,那么你无法search这些属性。 这是因为在search所有正在search的核心数据实体的search时,可能不会创build该属性。 从核心数据编程指南 (在清单1之后):

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

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

Interesting Posts