0

我对 Core Data 有一个奇怪的问题。问题是我正在寻找属性小于 X 的对象,并且它没有返回所有匹配的值。没有缓存,我没有使用 //[fetchRequest setFetchBatchSize:50];

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"self.level <= [cd] %@", [self.filters objectForKey:@"level"]];

我将它添加到谓词的 MutableArray 中,然后执行 NSPredicate *myPredicate = [NSCompoundPredicate andPredicateWithSubpredicates: subPredicates];

这是一个返回 myPredicate 的函数,称为 preparePredicates。目前没有更多的谓词,只有一个。它的 NSLog 返回:level <=[cd] "30"。我也尝试过使用字符串的 intValue 和 %i 的主要功能:

NSError* error;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"myEntity"
                                          inManagedObjectContext:self.context];
[fetchRequest setEntity:entity];
NSPredicate* predicate = [self preparePredicates]; 
[fetchRequest setPredicate:predicate];

//[fetchRequest setFetchBatchSize:50];
NSArray *fetchedObjects = [self.context executeFetchRequest:fetchRequest error:&error];
NSLog (@"Error: %@", error);
NSLog(@"los fetchedobjects: %i",[fetchedObjects count]);
return fetchedObjects;

它不返回任何错误。如果我查看结果,没有一个级别为 6,但还有其他匹配(均低于指定值)。我知道有一个 6 级。如果我在 SQLite 数据库浏览器中打开 .sqlite,我可以在那里看到它。如果我使用这个程序

SELECT * FROM zmyentity WHERE zlevel <30; 

它不会出现,就像在 Core Data 中一样。但是,如果我执行 SELECT * FROM zmyentity WHERE zlevel == 6; 它出现。我真的不知道发生了什么。也许我犯了一个菜鸟错误,所以请指出我正确的方向。非常感谢您提前。

4

1 回答 1

0

可能您已将级别存储为字符串属性,因为

"30" < "6"

比较字符串时。选择数字属性类型(整数 16/32/64)应该可以解决问题。类中的相应level属性myEntity则具有NSNumber类型。

您还应该[cd]在谓词中省略修饰符,因为这会强制进行字符串比较。

您的谓词可能如下所示:

[NSPredicate predicateWithFormat:@"self.level <= %d", [[self.filters objectForKey:@"level"] intValue]]
于 2013-01-11T06:17:38.663 回答