【问题标题】:Core data fetch request with NSPredicate?使用 NSPredicate 获取核心数据请求?
【发布时间】:2014-05-29 11:30:54
【问题描述】:

我正在使用此代码从 core data 获取数据

    NSFetchRequest * desFetctRequest = [[NSFetchRequest alloc] init];
    [desFetctRequest setEntity:[NSEntityDescription entityForName:@"IssueDescription" inManagedObjectContext:managedObjectContext]];
    [desFetctRequest setIncludesPropertyValues:NO];
    [desFetctRequest setPredicate:[NSPredicate predicateWithFormat:@"(issueId == %@) && (partyId == %@)",issueId, pid]];
   NSError * error = nil;
    NSArray * savedIssuesDes = [managedObjectContext executeFetchRequest:desFetctRequest error:&error];

但我得到 savedIssuesDes 数组和 0 个对象,但是如果我不使用预测,它会给我 savedIssuesDes 和 7 个对象。 我得到谓词的值为issueId == "42" AND partyId == "1" 我的谓词有问题吗? 但是我在其他项目中使用了 NSPredicate,得到了预期的结果。

编辑:这是我的IssueDescription 课程

@interface IssueDescription : NSManagedObject

@property (nonatomic, retain) NSString * desriptionId;
@property (nonatomic, retain) NSString * issueDesc;
@property (nonatomic, retain) NSString * issueId;
@property (nonatomic, retain) NSString * partyId;

@end

解决方案:正如大家所说,这里一切正常。partyId 在服务器端更改为party_id。我希望那个人在我面前。无论如何感谢大家的帮助。

【问题讨论】:

  • 只是问一个显而易见的问题:您是否三次检查过是否存在具有给定 issueId/partyId 组合的对象?
  • 您能在 xcdatamodel 中提供 IssueDescription 吗?
  • 谓词看起来很好,我看不到明显的错误。也许存储的 issueId/partyId 包含一些前导或尾随空格或换行符? - 如果你获取所有对象(没有谓词)然后用谓词过滤结果 array 会发生什么?

标签: ios objective-c core-data nspredicate


【解决方案1】:

对我来说看起来不错,但你也可以这样做。

我更喜欢这个,因为它更容易阅读(无论如何对我来说)。

只是想指出另一种您可以尝试的方法,它可能会使调试更容易......

NSFetchRequest * desFetctRequest = [NSFetchRequest fetchRequestWithEntityName:@"IssueDescription"];

[desFetctRequest setIncludesPropertyValues:NO];

NSPredicate *issuePredicate = [NSPredicate predicateWithFormat:@"issueId = %@", issueId];
NSPredicate *partyPredicate = [NSPredicate predicateWithFormat:@"partyId = %@", pId];

NSPredicate *compoundPredicate = [NSCompoundPredicate andPredicateWithSubPredicates:@[issuePredicate, partyPredicate];

[desFetctRequest setPredicate:compoundPredicate];

NSError *error = nil;
NSArray *savedIssuesDes = [managedObjectContext executeFetchRequest:desFetctRequest error:&error];

完成此操作后,请尝试将复合谓词更改为每个谓词只有一个,以确保您的模型包含正确的数据。

【讨论】:

  • 谢谢你说你救了我,一旦你这样做了,试着改变复合谓词每个只有一个谓词,以确保你的模型包含正确的数据partyId在服务器端的响应字典中已更改。
【解决方案2】:

尝试:

[desFetctRequest setPredicate:[NSPredicate predicateWithFormat:@"(issueId = %@) && (partyId = %@)",issueId, pid]];

NSString *format = [NSString stringWithFormat:@"(issueId == '%@') && (partyId == '%@')",issueId, pid];

[desFetctRequest setPredicate:[NSPredicate predicateWithFormat:format]];

【讨论】:

  • stringWithFormat 创建谓词字符串是个坏主意。如果任何参数字符串包含引号或其他特殊字符,则会失败。
【解决方案3】:

您是否尝试删除[desFetctRequest setIncludesPropertyValues:NO];

如果 includesPropertyValues 为 NO,那么 Core Data 只获取匹配记录的对象 ID 信息——它不会填充行缓存。 Core Data 仍然返回托管对象,因为它只需要托管对象 ID 来创建故障。但是,如果您随后触发错误,Core Data 会在(空)行缓存中查找,没有找到任何数据,然后再次返回存储区获取数据。

Apple docs link

【讨论】:

    【解决方案4】:

    你必须用 AND 替换 &&

    编辑:马丁是对的

    Edit2:您是否尝试使用 = 而不是 ==。如果您使用 ==,请尝试在谓词中使用 '%@'

    【讨论】:

    • 这是不正确的。 &&AND 都可以在谓词中使用,它们完全等价。
    • 很抱歉再次抱怨,但=== 在谓词中也是等价的。而'%@'肯定是错的,因为%@不会在引号内展开。
    • 是的,我必须先创建一个格式,然后将其用作 predicatewithFormat 的参数。我这里没有 Xcode 示例来验证,但我通常使用 NSPredicate 作为: [NSPredicate predicateWithFormat:@"attribute1 = %@ AND attribute2 = %@",value1, value2];当 value1 和 value2 是 NSString 时。
    猜你喜欢
    • 2018-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 2018-02-11
    • 2019-11-06
    相关资源
    最近更新 更多