1

我有一个核心数据类 SSSLicense,它具有名称和类型等属性。它继承自一个名为 SSSArchivableEntity 的抽象实体,该实体具有一个名为 isArchived 的布尔属性(等等)。

我已经从数据库中获取了完整的许可证实体集,现在正在尝试根据类型和 isArchived 标志进行过滤。然而,尽管我的谓词有很多变化,但我无法得到有效的结果。

以下是相关代码:

    NSSet *licenses = [person licenseList] ;

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(licenseType like %@) AND (isArchived == NO)",
                           lType];
NSSet *filteredLicenses = [licenses filteredSetUsingPredicate:predicate];

如果我将谓词更改为使用 SSSLicense 的另一个属性,例如名称(而不是 isArchived),则谓词有效。我什至向 SSSLicense 添加了一个简单的布尔属性并成功使用它进行过滤。

似乎它与 isArchived 是抽象实体的属性这一事实有关。我需要做一些特别的事情来过滤继承的属性吗?

谢谢!

4

3 回答 3

0

Maybe hard-coding the value does not work. I recommend using the standard syntax:

[NSPredicate predicateWithFormat:
    @"(licenseType like %@) && (isArchived = %@)", lType, @(NO)];

If this does not work I would manually check the value of your isArchived property via sqlite3 command line tool or SQLite Manager plugin in Firefox. Maybe you are expecting a value there that has not been persisted.

If all these are verified it could be that you are reading the wrong values or displaying the wrong values although the predicate actually works.

于 2013-06-23T09:31:18.733 回答
0

事实证明,这个问题是谓词如何通过 if 语句测试条件测试与直接测试的方式之一。我的种子数据通过直接 setter 调用创建了许可证,我没有明确将 isArchived 设置为 NO。在应用程序中,创建许可证时正在设置它。因此,种子数据未能通过谓词返回。但是,如果我手动遍历该集合并通过“[license isArchived] == NO”进行测试,则种子数据和应用程序数据都会按预期返回。

我的猜测是,直接布尔测试检查有效的“是”,如果没有,则假定否,而谓词明确检查 YES=1 NO=0(或无论如何表示)。

于 2013-06-24T16:04:47.460 回答
0

我宁愿更喜欢blocks而不是format,因此我会尝试这样的事情:

[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
    return ([[evaluatedObject licenseType] rangeOfString:lType].location == NSNotFound && [[evaluatedObject isArchived] boolValue] == NO);
}];
于 2013-06-23T19:34:29.157 回答