【问题标题】:Xcode 4: Fetch Request Template Variables?Xcode 4:获取请求模板变量?
【发布时间】:2011-10-29 07:12:22
【问题描述】:

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

这是在 XCode 4 中的什么地方?我已经按住选项,右键单击,单击选项等,但无法弄清楚....

【问题讨论】:

标签: objective-c core-data xcode4


【解决方案1】:

我认为 X4 不再具有该变量。

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

例如,给定实体Alpha 和属性aString,我创建了一个提取请求模板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; )

...然后就可以正常使用了。

NSError *error = nil;
NSArray *fetchedObjects = [self.moc executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
    NSLog(@"fetch error = %@",error);
}
NSLog(@"fetchObjects = %@",fetchedObjects);

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

【讨论】:

  • 其实你帮了我。我不经常使用 fetch 模板,也没有注意到编辑器发生了变化,所以这让我知道如何去做。
  • 为什么不经常使用 fetch 模板?在我看来,在一个地方定义所有模型谓词会使你的代码更简洁?
  • 大部分是习惯。在开发过程中,获取可能会经历很多演变,而在我的代码中更容易做到这一点。
  • 获取请求模板可以在大型数据集上提供巨大的性能提升。 (大约 30-50%)
【解决方案2】:

这已在 Xcode 4 中进行了调整。为了使用替换变量,您需要从弹出菜单中选择“表达式”(即,而不是属性名称),您可以像这样输入等价物:name == $SEARCH_NAME

如果您只是在字段中为每个属性输入一个 $VARIABLE 值,您将得到错误的结果。事实上,有些属性是不允许的,比如 Date 属性,你必须输入一个值。

当然你可以从那里使用多个变量。

那么就和之前一样执行获取请求:

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]);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-15
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多