【问题标题】:How to fetch NSSet from Core Data in Swift如何在 Swift 中从核心数据中获取 NSSet
【发布时间】:2015-05-27 23:13:26
【问题描述】:

我有一个 Person 类和一个 Brand 类,它们是 Core Data 中的关系。我知道如何获取整个 Person 类 (NSManagedObject),但我如何深入研究以仅获取与该人关联的品牌?

    import Foundation
    import CoreData

    class Person: NSManagedObject {

        @NSManaged var name: String
        @NSManaged var brands: NSSet

        func addBrandsObject(value: Brand) {
            self.mutableSetValueForKey("brands").addObject(value)
        }

    }

import Foundation
import CoreData

class Brand: NSManagedObject {

    @NSManaged var name: String
    @NSManaged var people: NSSet


}

视图控制器:

![import UIKit
import CoreData

    class BrandsTableTableViewController: UITableViewController {


        var brands = \[NSManagedObject\]()
        var selectedPerson: Person?
        var selectedBrand: Brand?

        //Fetch Core Data
        override func viewWillAppear(animated: Bool) {
            super.viewWillAppear(animated)
            self.fetchCoreData()
        }

        //Helper Function to Fetch Core Data
        func fetchCoreData() {
            //1
            let appDelegate =
            UIApplication.sharedApplication().delegate as! AppDelegate

            let managedContext = appDelegate.managedObjectContext!

            //2
            let fetchRequest = NSFetchRequest(entityName:"Person")

            //3
            var error: NSError?

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

            if let results = fetchedResults {
                ////what here? 
            } else {
                println("Could not fetch \(error), \(error!.userInfo)")
            }
        }][1]

【问题讨论】:

    标签: ios swift core-data


    【解决方案1】:

    由于您已经拥有 person 实例,因此只需访问关系:

        for person in results {
            let brandSet = person.brands
        }
    

    无需获取。

    这当然是假设您从PersonBrand 的关系称为brands

    还会有一些施法,没有施法就不能快速......

    【讨论】:

    • 我试过但得到 NSManagedObject 没有名为“brands”的成员?查看我编辑的问题...发布 XCDatamodel
    • 正如我所说,感谢 Swift,您需要进行一些转换。将结果转换为[Person]。假设您有一个PersonNSManagedObject 子类。如果不是,那么您将需要 A)子类 NSManagedObject 或 B)使用 valueForKey 来获得关系。
    • 这摆脱了错误:if let results = fetchedResults as? [Person] { for selectedPerson in results { let brandSet = selectedPerson.brands println(brandSet)
    • 但我的控制台日志返回“托管对象上的关系‘品牌’错误 (0x7fcd186414c0) (entity: Person; id: 0xd000000000040000 ;数据:{brands =“
    • 正确,因为对象还没有实现。它仍然是一个错误(不在内存中)。只要你触摸它,Core Data 就会意识到故障,并且完整的对象将可用。 Core Data Programming Guide 对此进行了介绍。
    【解决方案2】:

    您需要告诉它您正在获取的是“Person”对象,然后您可以遍历品牌。

    //Helper Function to Fetch Core Data
    func fetchCoreData() {
        //1
        let appDelegate =
        UIApplication.sharedApplication().delegate as! AppDelegate
    
        let managedContext = appDelegate.managedObjectContext!
    
        //2
        let fetchRequest = NSFetchRequest(entityName:"Person")
    
        //3
        var error: NSError?
    
        var people =
            managedContext.executeFetchRequest(fetchRequest,
            error: &error) as! [Person]
    
        // Get all brands from all people
        for (var x=0; x<people.count; x++) {
            let brands: NSArray = people[x].brands.allObjects
    
            for brand in brands {
                println(brand.name)
            }
        }
    }
    

    【讨论】:

    • 这真的没有告诉他如何遍历Brand集合的关系。
    • 这不是我想要的,但它确实返回了我想要的品牌
    猜你喜欢
    • 1970-01-01
    • 2015-04-20
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多