CoreData Swift and transient attribute getters

后端 未结 4 1685
我在风中等你
我在风中等你 2020-12-02 20:57

Any advice on implementing calculated attributes when using Core Data in Swift?

with the generated ManagedObject class, I tried to override the getter but I get the

4条回答
  •  佛祖请我去吃肉
    2020-12-02 21:29

    First, in the data model create a transient attribute (section). Because it is transient, it is not physically stored and thus not stored in the managed object context.

    The section attribute is shown here:

    enter image description here

    The entity is shown here:

    enter image description here

    The class NSManagedObject subclass should have computed 'section' attribute. The NSManagedObject subclass demonstrating how to accomplish this is shown here:

    class Number: NSManagedObject {
    
        @NSManaged var number: NSNumber
    
        var section: String? {
            return number.intValue >= 60 ? "Pass" : "Fail"
        }
    }
    

    Then you must set sectionForKeyPath in the NSFetchedResultsController initializer to be the transient attribute key in the data model and the cache name if desired.

    override func viewDidLoad() {
            super.viewDidLoad()
    
            fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest(), managedObjectContext: managedObjectContext!, sectionNameKeyPath: "section", cacheName: "Root")
            fetchedResultsController?.delegate = self
            fetchedResultsController?.performFetch(nil)
    
            tableView.reloadData()
    }
    
    func fetchRequest() -> NSFetchRequest {
    
        var fetchRequest = NSFetchRequest(entityName: "Number")
        let sortDescriptor = NSSortDescriptor(key: "number", ascending: false)
    
        fetchRequest.predicate = nil
        fetchRequest.sortDescriptors = [sortDescriptor]
        fetchRequest.fetchBatchSize = 20
    
        return fetchRequest
    }
    

    The result is a UITableViewController with grades sorted by pass or fail dynamically:

    enter image description here

    I made a sample project that can be found on GitHub.

提交回复
热议问题