Core Data Predicate iOS 4 -> работает iOS 5 -> сбой - PullRequest
1 голос
/ 30 ноября 2011

Я работаю над приложением, использующим базовую модель данных, и при использовании NSPredicate.

моя модель данных выглядит следующим образом:

Asset
1 to 1 relationship with SearchAsset
many to many relationship with SearchTerms

Asset имеет несколько полей, таких как unique_ID, URL и т. Д., В то время как SearchTerms имеет только одно поле, называемое терминами.SearchAsset не имеет полей, он только указывает на актив.

Когда я хочу выполнить поиск, я вызываю следующий код:

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
    dbgPrint(@"Search text: %@", searchText);
    if ([searchText length]>0){
        NSString *prefix = [SearchTerm normalizedTerm:searchText];


        NSPredicate *predicate = nil;
        if ([[[UIDevice currentDevice] systemVersion] floatValue]<5.0){
            predicate = [NSPredicate predicateWithFormat:
                         @"asset != NULL && SUBQUERY(asset.searchTerms, $x, $x.term BEGINSWITH %@).@count > 0",prefix];
        } else {
            predicate = [NSPredicate predicateWithFormat:
                         @"asset != NULL && SUBQUERY(asset.searchTerms, $x, $x.term BEGINSWITH %@).@count > 0",prefix];
        }

        NSFetchedResultsController *theFetcher = self.searchResultsController;
        [theFetcher.fetchRequest setPredicate:predicate];

        NSError *error=nil;
        [theFetcher performFetch:&error];
        if (error){
            dbgPrint(@"Error performing fetch");
            dbgAbort();
        } else {
            NSUInteger count=[[self.searchResultsController fetchedObjects] count];
            dbgPrint(@"Fetching of %d sucessful", count);
            [NSFetchedResultsController deleteCacheWithName:[SearchAsset cacheName]];
            [self.gridView reloadData];
        }
    }
}

В iOS 4 он работает нормально, но наiOS 5 я получаю следующую ошибку:

Core Data: annotation: -executeRequest: encountered exception = I/O error for database at /Users/markuspfundstein/Library/Application Support/iPhone Simulator/5.0/Applications/87DE3380-A49F-493E-B9FF-77DFBC65669E/Documents/TopNotch-1.0.2.2.sqlite.  SQLite error code:1, 'no such column: t2.ZTERM' with userInfo = {
NSFilePath = "/Users/markuspfundstein/Library/Application Support/iPhone Simulator/5.0/Applications/87DE3380-A49F-493E-B9FF-77DFBC65669E/Documents/TopNotch-1.0.2.2.sqlite";
NSSQLiteErrorDomain = 1;
}

Кажется, что анализатор предикатов работает по-разному на iOS5, но мне не удалось найти какие-либо заметки от Apple об этой проблеме.* Обновление

ПОЛНОЕ РЕШЕНИЕ: предикат работает, если я получаю данные из Активов напрямую, без ссылки на SearchAsset.Предикат выглядит примерно так:

predicate = [NSPredicate predicateWithFormat:
                         @"SUBQUERY(searchTerms, $x, $x.term BEGINSWITH %@).@count > 0",prefix];

На мой взгляд, это ошибка в библиотеке iOS 5 Core Data.К сожалению, сейчас мне приходится переписывать большие части модели базы данных ...

...