NSPredicate 比较数字问题

NSPredicate compare numbers issue

我有这个函数应该使用 Predicate 从 CoreData 获取:

- (NSArray*)fetchingManagedObjectsWithEntityName:(NSString*)entityName predicate:(NSString*)predicateFormat
{
    NSManagedObjectContext *moc = [[MainDb sharedDb] managedObjectContext];
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:entityName inManagedObjectContext:moc];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entityDescription];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateFormat];
    [request setPredicate:predicate];

    NSError *error;
    NSArray *array = [moc executeFetchRequest:request error:&error];
    if (array.count == 0)
    {
        return @[];
    }
    return array;
}

但由于某种原因它不能正常工作,我是这样称呼它的:

NSArray *objects = [[DownloadData sharedData] fetchingManagedObjectsWithEntityName:@"DbSomething" predicate:[NSString stringWithFormat:@"somethingId == %d", someId.intValue]];

我也试过这些谓词:

[NSString stringWithFormat:@"somethingId == '%d'", someId.intValue]
[NSString stringWithFormat:@"somethingId == %ld", someId.integerValue]
[NSString stringWithFormat:@"somethingId == '%ld'", someId.integerValue]
[NSString stringWithFormat:@"somethingId == %@", someId]
[NSString stringWithFormat:@"somethingId == '%@'", someId]

CoreData DbSomething 对象中的 'somethingId' 是一个 NSNumber。

我总是得到一个包含所有 'DbSomething' 对象的列表,看起来像这样,最后一个总是带有数据,所有其他的都是 'fault':

<_PFArray 0x1700368c0>(
<DbSomething: 0x1702db890> (entity: DbSomething; id: 0xd0000000005c0012 <x-coredata://FD3BA7EB-B2D7-4133-B209-A94C58949C2F/DbHomeDish/p23> ; data: <fault>),
<DbSomething: 0x1702db9e0> (entity: DbSomething; id: 0xd000000000c00012 <x-coredata://FD3BA7EB-B2D7-4133-B209-A94C58949C2F/DbHomeDish/p48> ; data: <fault>),
<DbSomething: 0x1702db900> (entity: DbSomething; id: 0xd000000001280012 <x-coredata://FD3BA7EB-B2D7-4133-B209-A94C58949C2F/DbHomeDish/p74> ; data: <fault>),
<DbSomething: 0x1702db970> (entity: DbSomething; id: 0xd0000000019c0012 <x-coredata://FD3BA7EB-B2D7-4133-B209-A94C58949C2F/DbHomeDish/p103> ; data: <fault>),
<DbSomething: 0x1702db740> (entity: DbSomething; id: 0xd000000002340012 <x-coredata://FD3BA7EB-B2D7-4133-B209-A94C58949C2F/DbHomeDish/p141> ; data: <fault>),
<DbSomething: 0x1702d9830> (entity: DbSomething; id: 0xd000000002980012 <x-coredata://FD3BA7EB-B2D7-4133-B209-A94C58949C2F/DbHomeDish/p166> ; data: <fault>),
<DbSomething: 0x1702db820> (entity: DbSomething; id: 0xd000000003240012 <x-coredata://FD3BA7EB-B2D7-4133-B209-A94C58949C2F/DbHomeDish/p201> ; data: <fault>),
<DbSomething: 0x1702db7b0> (entity: DbSomething; id: 0xd000000003680012 <x-coredata://FD3BA7EB-B2D7-4133-B209-A94C58949C2F/DbHomeDish/p218> ; data: <fault>),
<DbSomething: 0x1702d7d80> (entity: DbSomething; id: 0xd000000003e00012 <x-coredata://FD3BA7EB-B2D7-4133-B209-A94C58949C2F/DbHomeDish/p248> ; data: <fault>),
<DbSomething: 0x1702d82c0> (entity: DbSomething; id: 0xd000000004740012 <x-coredata://FD3BA7EB-B2D7-4133-B209-A94C58949C2F/DbHomeDish/p285> ; data: <fault>),
<DbSomething: 0x1742cf490> (entity: DbSomething; id: 0xd000000004e40012 <x-coredata://FD3BA7EB-B2D7-4133-B209-A94C58949C2F/DbHomeDish/p313> ; data: {
    somethingId = 168;
})
)

提前致谢!

我不确定您使用传递的谓词字符串生成的谓词是否可靠。

我希望 predicateWithFormat 需要一个格式字符串,因此它可以使用给定的参数进行插值,而不是将参数插入到格式字符串中。在某些情况下,它的工作方式肯定不同于 NSString 方法 stringWithFormat

例如

[NSPredicate predicateWithFormat:@"name = %@", @"John"]  // "name = 'John'"
[NSString stringWithFormat:@"name = %@", @"John"]        // "name = John"

我们真的知道谓词的内部表示是什么吗?我们知道传递给 SQLite 的字符串是什么(通过打开 SQLite 调试),我们知道 description return 是什么,但是我们不知道谓词在内部是如何工作的。

因此,您或许应该重构您的方法以接受谓词而不是谓词字符串。

而且,你的方法几乎没有必要。它的作用无论如何都可以更简洁地实现。

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:"Something"];
request.predicate = [NSPredicate predicateWithFormat:@"id = %@", aNumber];
NSArray *result = [[MainDb sharedDb].context executeFetchRequest:request error:nil];

计算当您必须自己构造谓词时需要的额外代码行,调用您的方法几乎没有优势。请注意,如果没有结果,上述内容也会 return 一个空数组。