Я работаю над приложением, использующим базовую модель данных, и при использовании 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.К сожалению, сейчас мне приходится переписывать большие части модели базы данных ...