8

我总是完全在代码中创建我的 NSFetchRequests。现在我正在查看用于构建获取请求并将其存储在模型中的 Xcode GUI。

我正在遵循 Xcode 文档中的示例。我在模型中添加了一个 Fetch Request,通过 Modeling GUI 创建的谓词是:

 firstName LIKE[c] "*SUBSTRING*"

然后我用这两行检索该请求:

NSDictionary *substituionDictionary = [NSDictionary dictionaryWithObject:@"woody" forKey:@"SUBSTRING"];

NSFetchRequest *fetchRequest = [mom fetchRequestFromTemplateWithName:@"firstNameContains" substitutionVariables:substituionDictionary];

生成的 NSFetchRequest 的 NSLog 输出以下内容:

(entity: Customer; predicate: (firstName LIKE[c] "*SUBSTRING*"); sortDescriptors: (null); limit: 0)

.. 这表明在返回存储的 FetchRequest 之前变量没有被替换。

那么,如何指定在 Xcode Data Modeling Fetch Request Predicate Builder GUI 中输入的文本在运行时被 NSFetchRequest:fetchRequestFromTemplateWithName:substitutionVariables: 替换?

谢谢!

伍迪

4

2 回答 2

6

您需要右键单击包含预期变量的获取请求谓词编辑器的行,然后从弹出窗口中选择“VARIABLE”。有时在 Xcode 编辑器中右键单击的位置很挑剔,所以我倾向于单击 +/- 按钮的左侧。

于 2010-05-24T16:12:42.213 回答
0

这是替换变量的示例。

首先在 Fetch Requests 部分创建 fetchRequest 模板。

在此处输入图像描述

然后编写按名字获取员工的代码。

   func employeeByFirstName(fName: String) -> [Employee]{

    let viewContext = self.persistentContainer.viewContext

    var substitutionVariables: [String: Any] = [String : Any]()
    substitutionVariables["FIRSTNAME"] = fName
    let fetchRequest = fetchRequestBy(name: "fetchByFirstName", variables: substitutionVariables) as! NSFetchRequest<Employee>

    do {
        let objects = try viewContext.fetch(fetchRequest)
        return objects
    } catch  {
        let nserror = error as NSError
        fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
    }
}


   func fetchRequestBy(name: String, variables: [String : Any]) -> NSFetchRequest<NSFetchRequestResult>? {
      let model = self.persistentContainer.managedObjectModel
      let fetchRequest = model.fetchRequestFromTemplate(withName: name, substitutionVariables: variables)
      return fetchRequest
   }
于 2019-04-09T11:23:25.480 回答