使用NSPredicate核心数据获取请求?

时间:2014-05-29 11:30:54

标签: ios objective-c core-data nspredicate

我使用此代码从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。我希望那个人在我面前。不管怎样,谢谢你们的帮助。

4 个答案:

答案 0 :(得分: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];

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

答案 1 :(得分:0)

尝试:

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

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

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

答案 2 :(得分:0)

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

  

如果includesPropertyValues为NO,则Core Data仅提取匹配记录的对象ID信息 - 它不会填充行缓存。 Core Data仍然返回托管对象,因为它只需要托管对象ID来创建故障。但是,如果您随后触发了故障,Core Data会在(空)行缓存中查找,找不到任何数据,然后第二次返回到存储中以获取数据。

Apple docs link

答案 3 :(得分:-1)

你必须更换&&通过AND

编辑:马丁是对的

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

中使用'%@'