Coredata не поддерживается в предикате, но только для не домашних вычислений - PullRequest
1 голос
/ 25 января 2012

Я следую примеру Apple об эффективном импорте данных (http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/CoreData/Articles/cdImporting.html)

Мой пример кода выглядит следующим образом

NSString* predicateString = @" IN %@)";
predicateString = [NSString stringWithFormat:@"(%@%@", predicatePrefix, predicateString];

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity: [NSEntityDescription entityForName:entityName inManagedObjectContext: self.managedObjectContext]];
[fetchRequest setPredicate: [NSPredicate predicateWithFormat:predicateString, sortedServerIDs]];

// make sure the results are sorted as well
[fetchRequest setSortDescriptors: [NSArray arrayWithObject:
                                   [[NSSortDescriptor alloc] initWithKey: predicatePrefix
                                                               ascending:YES]]];

NSError *error = nil;
NSArray *matchingManagedObjects = [__managedObjectContext executeFetchRequest:fetchRequest error:&error];

В результате возникает ошибка

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: 'unimplemented SQL generation for predicate : (businessesID IN {1, 2, 3, 4, 5, 6, 7, 39})'

Однако это работает на моем домашнем компьютере в симуляторе и работает на моем устройстве! Я запускаю xcode 4.2.1 на обеих машинах.

Я попытался следовать этому ответу: Поддерживает ли CoreData на iPhone предикаты IN?

Но получил ту же ошибку

Если это имеет значение, когда я проверяю свою версию SQLite на моем компьютере, у меня есть:

sqlite3 - версия 3.7.8 2011-09-19 14:49:19 3e0da808d2f5b4d12046e05980ca04578f581177

1 Ответ

0 голосов
/ 25 января 2012

Вам нужно использовать% K в строке формата, когда вы ссылаетесь на имя поля

NSString* predicateString = @" IN %@)";
predicateString = [NSString stringWithFormat:@"(%K%@", predicatePrefix, predicateString];

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity: [NSEntityDescription entityForName:entityName inManagedObjectContext: self.managedObjectContext]];
[fetchRequest setPredicate: [NSPredicate predicateWithFormat:predicateString, sortedServerIDs]];

// make sure the results are sorted as well
[fetchRequest setSortDescriptors: [NSArray arrayWithObject:
                               [[NSSortDescriptor alloc] initWithKey: predicatePrefix
                                                           ascending:YES]]];

NSError *error = nil;
NSArray *matchingManagedObjects = [__managedObjectContext executeFetchRequest:fetchRequest error:&error];
...