具有存储在核心数据模型中的获取请求的变量替换

问题描述 投票:8回答:2

我总是在代码中创建我的NSFetchRequests。现在我正在寻找Xcode GUI来构建一个获取请求并将其存储在模型中。

我正在关注Xcode文档中的一个示例。我向模型添加了一个获取请求,并且通过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数据建模获取请求谓词生成器GUI中输入的文本将在运行时由NSFetchRequest替换:fetchRequestFromTemplateWithName:substitutionVariables:?

谢谢!

伍迪

cocoa core-data data-modeling nsfetchrequest nspredicateeditor
2个回答
6
投票

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


0
投票

以下是替换变量的示例。

首先在获取请求部分中创建fetchRequest模板。

enter image description here

然后用firstName编写fetch employee的代码。

   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
   }
© www.soinside.com 2019 - 2024. All rights reserved.