Запись NSPredicate, который возвращает true, если условие не соблюдают

Гораздо больше информации можно найти здесь .

Однако имейте в виду:

В SQL Server модель подготовки / выполнения не имеет существенного преимущества в производительности по сравнению с прямым выполнением, поскольку SQL Server повторно использует планы выполнения. SQL Server имеет эффективные алгоритмы для сопоставления текущих операторов SQL с планами выполнения, которые создаются для предыдущих выполнений того же оператора SQL. Если приложение выполняет инструкцию SQL с маркерами параметров несколько раз, SQL Server будет повторно использовать план выполнения из первого выполнения для второго и последующих выполнений (если только план не устаревает из кэша процедур). Модель подготовки / выполнения все еще имеет следующие преимущества:

Поиск плана выполнения с помощью идентифицирующего дескриптора более эффективен, чем алгоритмы, используемые для сопоставления оператора SQL с существующими планами выполнения.

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

Модель подготовки / выполнения переносима на другие базы данных, включая более ранние версии SQL Server.

9
задан Josh Caswell 14 August 2015 в 02:38
поделиться

2 ответа

Я не эксперт по Objective-C, но документация , кажется, предполагает, что это возможно . Вы пробовали:

predicateWithFormat:"not SELF contains '-'"
27
ответ дан 4 December 2019 в 06:35
поделиться

Вы можете создать собственный предикат, чтобы отрицать предикат, который у вас уже есть. Фактически, вы берете существующий предикат и заключаете его в другой предикат, который работает как оператор NOT:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF contains '-'"];
NSPredicate *notPred = [NSCompoundPredicate notPredicateWithSubpredicate:pred];
[resultsArray filterUsingPredicate:pred];

Класс NSCompoundPredicate поддерживает типы предикатов AND, OR и NOT, поэтому вы можете пройти через и создайте большой составной предикат со всеми символами, которые вам не нужны в вашем массиве, а затем отфильтруйте его. Попробуйте что-нибудь вроде:

// Set up the arrays of bad characters and strings to be filtered
NSArray *badChars = [NSArray arrayWithObjects:@"-", @"*", @"&", nil];
NSMutableArray *strings = [[[NSArray arrayWithObjects:@"test-string", @"teststring", 
                   @"test*string", nil] mutableCopy] autorelease];

// Build an array of predicates to filter with, then combine into one AND predicate
NSMutableArray *predArray = [[[NSMutableArray alloc] 
                                    initWithCapacity:[badChars count]] autorelease];
for(NSString *badCharString in badChars) {
    NSPredicate *charPred = [NSPredicate 
                         predicateWithFormat:@"SELF contains '%@'", badCharString];
    NSPredicate *notPred = [NSCompoundPredicate notPredicateWithSubpredicate:pred];
    [predArray addObject:notPred];
}
NSPredicate *pred = [NSCompoundPredicate andPredicateWithSubpredicates:predArray];

// Do the filter
[strings filterUsingPredicate:pred];

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

8
ответ дан 4 December 2019 в 06:35
поделиться