【问题标题】:Retrieving attributes for ManagedObjects检索 ManagedObjects 的属性
【发布时间】:2015-04-10 15:34:25
【问题描述】:

需要使用 Swift 访问 Core Data 记录。

理想情况下,我想调用我的类“核心数据”,它返回 ManagedObject 或 false(不存在对象)。但是目前,当我想检索 ManagedObject 上的属性时,我得到编译器错误 [NSManagedObject] does not have a member named 'valueForKey'

我知道类似的问题(例如swift optional chaining with cast),但我无法解决这个问题。需要帮助:)

为了进行故障排除,我正在尝试访问课程中已有的属性(稍后将在课程外完成)。代码如下。 为什么会出现编译器错误,我该如何解决?

谢谢!

class CoreData{

    // Fetch existing data (from Core Data)
    func getData(entity: String) -> AnyObject {

        // Set delegate
        let appDelegate =
        UIApplication.sharedApplication().delegate as AppDelegate

        let managedContext = appDelegate.managedObjectContext!

        // Get entity = a table (filter)
        let fetchRequest = NSFetchRequest(entityName:entity)

        // Create error variable
        var error: NSError?

        // Get record
        let fetchedResults =
        managedContext.executeFetchRequest(fetchRequest,
        error: &error) as [NSManagedObject]?

        if let results = fetchedResults {
            // Data retrieved
            var temp = results.valueForKey("gender") as String // <-- ERROR
            println(temp)
            return results
        } else {
            // Could not obtain data - log it
            println("Could not fetch \(error), \(error!.userInfo)")
            return false
        }
    }
}

【问题讨论】:

    标签: swift core-data nsmanagedobject


    【解决方案1】:

    NSArray 有一个 valueForKey 方法,但 Swift 数组没有。 您有以下选择:

    • 将 Swift 数组转换为 NSArray:

      var temp = (results as NSArray).valueForKey("gender") as! String 
      
    • 在 Swift 数组上使用 map(),在每个对象上使用 valueForKey

      var temp = map(results) { $0.valueForKey("gender") as! String }
      
    • (推荐)让 Xcode 为您的实体创建 NSManagedObject 子类,并将 map() 与属性访问器一起使用:

      var temp = map(results) { $0.gender }
      

    (以上示例代码适用于当前的 Xcode 6.3/Swift 1.2,在早期 版本你必须使用as 而不是as!。)

    或者,您可以使用.DictionaryResultType 创建一个获取请求,以仅获取一些选定的属性, 示例见Fetching selected attribute in entities

    【讨论】:

    • Martin R - 你就是男人!现在阅读子类选项 - 确实看起来更好 - 感谢您指出!关于字典方法的好奇问题:如果您请求多个属性并且一个(或多个)不存在 - 提取会一起失败 - 还是带来确实存在的属性? 再次感谢 - 让我开心 - 祝你周末愉快!
    • @PederWessel:不客气! – 如果propertiesToFetch 包含任何不是实体实际属性的属性,则获取请求将失败。
    • 谢谢马丁。享受周末
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    相关资源
    最近更新 更多