带有谓词的 ios 核心数据错误

Posted

技术标签:

【中文标题】带有谓词的 ios 核心数据错误【英文标题】:ios Core data bug with predicate 【发布时间】:2014-03-10 09:02:16 【问题描述】:

我的核心数据有一些奇怪的行为。

我有实体Card,它有NSNumber 属性idObject

当我想更改此卡中的某些信息时,我尝试在我的 CoreData 中查找类似的卡,但有时它可以工作,有时不能。我的意思是下一个:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Card"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"idObject == %@", objectId];
request.predicate = predicate;
NSError *error;
NSArray *objects = [self.backgroundManagedObjectContext executeFetchRequest:request error:&error];

此代码有时返回对象数组,但有时返回 nil。我在上一部分代码之后添加下一个代码:

request.predicate = nil;
NSArray *cards = [self.backgroundManagedObjectContext executeFetchRequest:request error:nil];

错误总是零,所以一切都很好。 而cards 数组有CardidObject,我试图找到。所以最后如果我们尝试多次执行下一个代码:

NSLog(@"idObject -%@-", objectId);
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Card"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"idObject == %@", objectId];
request.predicate = predicate;
NSError *error;
NSArray *objects = [self.backgroundManagedObjectContext executeFetchRequest:request error:&error];
NSLog(@"objects count = %i", objects.count);
request.predicate = nil;
NSArray *cards = [self.backgroundManagedObjectContext executeFetchRequest:request error:nil];
NSLog(@"\nCards:");
for (Card *card in cards) 
    NSLog(@"id -%@-", card.idObject);

所以我们有下一个结果。在第一次你可以看到下一个:

2014-03-10 11:58:47.115[4397:6613] idObject -1-
2014-03-10 11:58:47.127[4397:6613] objects count = 1
2014-03-10 11:58:47.134[4397:6613] 
Cards:
2014-03-10 11:58:47.145[4397:6613] id -5-
2014-03-10 11:58:47.146[4397:6613] id -4-
2014-03-10 11:58:47.148[4397:6613] id -1-
2014-03-10 11:58:47.148[4397:6613] id -2-
2014-03-10 11:58:47.149[4397:6613] id -6-
2014-03-10 11:58:47.150[4397:6613] id -8-
2014-03-10 11:58:47.151[4397:6613] id -7-
2014-03-10 11:58:47.152[4397:6613] id -3-

第二个它返回我:

2014-03-10 11:59:42.752[4397:9e2b] idObject -1-
2014-03-10 11:59:42.758[4397:9e2b] objects count = 0
2014-03-10 11:59:42.761[4397:9e2b] 
Cards:
2014-03-10 11:59:42.762[4397:9e2b] id -1-
2014-03-10 11:59:42.764[4397:9e2b] id -5-
2014-03-10 11:59:42.766[4397:9e2b] id -2-
2014-03-10 11:59:42.768[4397:9e2b] id -6-
2014-03-10 11:59:42.769[4397:9e2b] id -8-
2014-03-10 11:59:42.771[4397:9e2b] id -3-
2014-03-10 11:59:42.773[4397:9e2b] id -4-
2014-03-10 11:59:42.775[4397:9e2b] id -7-

所以我在cards 数组中总是有Card 和这样的idObject,但是为什么用我的谓词,它有时会返回我那张卡,有时不会?怎么了?

【问题讨论】:

谓词中objectId的类型是什么? @Akhilrajtr,妈的,我太菜了 =( 没错,我在谓词 NSString 中使用,但在属性中我有 NSNumber。谢谢,写下你的答案,我投票给它喜欢正确的答案,非常感谢 从文档中,executeFetchRequest 返回 nil 的唯一时间是发生错误时,所以记录错误,它应该说明出了什么问题...... 【参考方案1】:

Card 实体属性idObjectNSNumber 的类型,将谓词中的idObject 更改为NSNumber IE。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"idObject == %@", [NSNumber numberWithInt:[idObject integerValue]]];

或使用NSNumberFormatteridObject 更改为NSNumber

希望对你有帮助

【讨论】:

以上是关于带有谓词的 ios 核心数据错误的主要内容,如果未能解决你的问题,请参考以下文章

核心数据:实例化后谓词为零

带有谓词的弹簧数据 JPA 方法 findAll() - QueryDslPredicateExecutor

带有谓词的核心数据获取请求。需要正确的 NSPredicate

谓词匹配一对多关系核心数据

快速谓词导致错误无法识别选择器发送到实例 0x156c9580'

xCode / iOS - 需要帮助使核心数据搜索谓词工作