Objective c 核心数据谓词iOS 4->;工程iOS 5->;崩溃
我正在开发一个应用程序,它使用核心数据模型,在使用Objective c 核心数据谓词iOS 4->;工程iOS 5->;崩溃,objective-c,ios,core-data,subquery,predicate,Objective C,Ios,Core Data,Subquery,Predicate,我正在开发一个应用程序,它使用核心数据模型,在使用NSPredicate时遇到了一个问题 我的数据模型如下所示: Asset 1 to 1 relationship with SearchAsset many to many relationship with SearchTerms predicate = [NSPredicate predicateWithFormat: @"SUBQUERY(searchTerms, $x, $x.term
NSPredicate
时遇到了一个问题
我的数据模型如下所示:
Asset
1 to 1 relationship with SearchAsset
many to many relationship with SearchTerms
predicate = [NSPredicate predicateWithFormat:
@"SUBQUERY(searchTerms, $x, $x.term BEGINSWITH %@).@count > 0",prefix];
Asset
有几个字段,如unique\u ID、URL等。。而SearchTerms
只有一个名为terms的字段<代码>搜索资产没有字段,它只指向资产
当我想进行搜索时,我调用以下代码:
-(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];
}
}
}
谓词解析器在iOS5上的工作方式似乎有所不同,但我无法从苹果那里找到关于这个问题的任何注释
更新
半途而废的解决方案:如果我直接从资产中提取,而不引用SearchAsset,则谓词可以工作。谓词看起来不像这样:
Asset
1 to 1 relationship with SearchAsset
many to many relationship with SearchTerms
predicate = [NSPredicate predicateWithFormat:
@"SUBQUERY(searchTerms, $x, $x.term BEGINSWITH %@).@count > 0",prefix];
在我看来,这是iOS5核心数据库中的一个bug。这很不幸,因为我现在必须重写数据库模型的大部分…如果去掉谓词的
“asset!=null”
部分,您仍然会得到错误吗?不,对不起。。如果我测试asset==NULL,则谓词有效。然后我得到了一大堆的结果。。所以这是关于远期报表asset.searchTerms.term…是否可能是一个区分大小写的问题?您是否尝试了“资产”
而不是“资产”
?也许他们开始在iOS 5中对case更加严格了…不,也不是。。我对案件敏感度一直很敏感:-)这是我检查的第一件事。。!同样奇怪的是,当我通过SQLLite数据库应用程序运行解析的IOS5代码时,同样的错误也会发生。解析后的iOS4代码可以正常工作。。这一定是核心数据库中的一个bug。如果你能制作一个非常简单的测试应用程序来演示这个bug,请将它压缩并提交给苹果。