Objective c Xcode 4:获取请求模板变量?

Objective c Xcode 4:获取请求模板变量?,objective-c,core-data,xcode4,Objective C,Core Data,Xcode4,在Xcode 3.X中,应该右键单击fetch请求模板谓词编辑器中的空格,以指定变量输入,而不是硬编码谓词 这在XCode 4中的什么位置?我持有期权,右键点击,期权点击,等等,但无法理解 我认为X4不再有变量了 相反,我认为您必须选择一个表达式,然后提供一个$VARNAME形式的变量 例如,给定一个具有属性aString的实体Alpha,我创建了一个fetch请求模板bobFetch,其表达式为aString==$TESTVAR Alpha *a=[NSEntityDescription in

在Xcode 3.X中,应该右键单击fetch请求模板谓词编辑器中的空格,以指定变量输入,而不是硬编码谓词

这在XCode 4中的什么位置?我持有期权,右键点击,期权点击,等等,但无法理解


我认为X4不再有变量了

相反,我认为您必须选择一个表达式,然后提供一个
$VARNAME
形式的变量

例如,给定一个具有属性
aString
的实体
Alpha
,我创建了一个fetch请求模板
bobFetch
,其表达式为
aString==$TESTVAR

Alpha *a=[NSEntityDescription insertNewObjectForEntityForName:@"Alpha" inManagedObjectContext:self.moc];
a.aString=@"steve";
[self saveContext];
NSDictionary *subVars=[NSDictionary dictionaryWithObject:@"steve" forKey:@"TESTVAR"];
NSFetchRequest *fetchRequest =   [self.managedObjectModel fetchRequestFromTemplateWithName:@"bobRequest" substitutionVariables:subVars];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Alpha" inManagedObjectContext:self.moc];
[fetchRequest setEntity:entity];
如果记录了fetchRequest报告:

<NSFetchRequest: 0x4d17480> (entity: Alpha; predicate: (aString == "steve"); sortDescriptors: ((null)); type: NSManagedObjectResultType; )

对于图形环境来说有点笨拙,但它可以工作

这在Xcode 4中进行了调整。为了使用替换变量,您需要从弹出菜单中选择“表达式”(即,而不是属性名称),并且您可以按如下方式输入等效项:
name==$SEARCH\u name

如果只是在字段中为每个属性输入$VARIABLE值,则会得到错误的结果。事实上,某些属性不允许这样做,例如强制输入值的日期属性

当然,从那时起,您可以使用多个变量

然后,执行fetch请求与之前一样:

NSString *searchName = @"Mr Squiggle";
NSDictionary *subs = [NSDictionary dictionaryWithObject:searchName forKey:@"SEARCH_NAME"];
NSManagedObjectModel *model = [self managedObjectModel];
NSFetchRequest *req = [model fetchRequestFromTemplateWithName:@"trainerByName" substitutionVariables:subs];
NSError *error = nil;
NSArray *results = [[self managedObjectContext] executeFetchRequest:req error:&error];
NSLog(@"Found %ld record.", [results count]);

注意:您也可以取消属性弹出窗口,只需单击编辑器右上角的按钮(看起来像默认网格视图按钮旁边的线条),然后直接输入表达式。这是一个很好的方法,可以了解日期等信息是如何被翻译的。

事实上,你帮了我的忙。我不经常使用获取模板,也没有注意到编辑器已经更改,所以这让我想一想怎么做。为什么不更频繁地使用获取模板呢?在我看来,在一个地方定义所有的模型谓词会使代码更加简洁,主要是习惯性的。在开发过程中,回迁可以经历很多演变,在代码中这样做对我来说更容易。回迁请求模板可以在大型数据集上提供巨大的性能提升。(约30-50%)可能重复的
NSString *searchName = @"Mr Squiggle";
NSDictionary *subs = [NSDictionary dictionaryWithObject:searchName forKey:@"SEARCH_NAME"];
NSManagedObjectModel *model = [self managedObjectModel];
NSFetchRequest *req = [model fetchRequestFromTemplateWithName:@"trainerByName" substitutionVariables:subs];
NSError *error = nil;
NSArray *results = [[self managedObjectContext] executeFetchRequest:req error:&error];
NSLog(@"Found %ld record.", [results count]);