2015-03-04 2 views
0

У меня есть эта функция, которая должна получать от CoreData с Predicate:NSPredicate сравнения номера вопрос

- (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]]; 

I «ве попробовал эти предикаты, а также:

[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] 

„somethingId“, который находится в объекте CoreData DbSomething является NSNumber.

Я всегда получаю список всех объектов в «DbSomething», который выглядит так, последний всегда с данными, все остальные «вина»:

<_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; 
}) 
) 

Заранее спасибо!

+0

попытайтесь передать не строку для предиката, а предикатный объект в качестве параметра. В некоторых случаях в моем коде возникли некоторые проблемы. и 'x ==% d' с' .integerValue' всегда работал для меня лучшим – geo

+0

@geo Он также не работает [[NSString stringWithFormat: @ "somethingId ==% d", someId.integerValue] ' –

+0

' - (NSArray *) fetchingManagedObjectsWithEntityName: (NSString *) entityName предикат: (NSPredicate *) p_predicate' -> 'if (pPredicate) [request setPredicate: p_predicate];' просто подсказка, чтобы избежать некоторых ошибок, возможно, не решение этой проблемы. Вот почему это всего лишь комментарий;) и можете ли вы перебирать все сущности и печатать свой (переопределенный) метод stringValue? Действительно ли они все пробелы? – geo

ответ

2

Я не уверен, что ваш предикат, созданный с переданной предикатной строкой, является надежным.

Я ожидал бы, что predicateWithFormat ожидает строку формата, поэтому он может интерполировать с данными аргументами, а не иметь аргументы, уже вставленные в строку формата. Он определенно работает таким образом, который в некоторых случаях отличается от метода NSStringstringWithFormat.

E.g.

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

Действительно ли мы знаем, что такое внутреннее представление предиката? Мы знаем, какая строка передается SQLite (путем включения отладки SQLite), и мы знаем, что возвращает description, но мы не знаем, как предикат работает внутри.

Следовательно, вы должны, возможно, реорганизовать свой метод, чтобы принять предикат, а не строку предиката.

Кроме того, ваш метод вряд ли необходим. То, что он делает, в любом случае может быть достигнуто гораздо более лаконично.

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

Подсчет дополнительных строк кода вам нужно, когда вы должны построить предиката себя, называя свой метод вряд ли является преимуществом. Обратите внимание, что вышеизложенное также возвращает пустой массив, если результатов нет.

+0

Отличный ответ, хотя это не было моей проблемой, проблема заключалась в том, что у меня было более одного объекта с одним ID. В любом случае, спасибо! –

Смежные вопросы