saveContext()工作中的差异取决于viewController的实例化。CoreData谜题

问题描述 投票:0回答:1

该项目具有简约的CoreData堆栈。

我有一个UIViewController子类“ AddOrChangeEntityVC”来创建NSManagedObject,更改其属性并将数据写入DB。

如果从以下位置创建“ AddOrChangeEntityViewController”,列出的功能将正常工作MyFirstVC,MySecondVC,...和MyNinthVC以及其他任何视图控制器都仅提供一个BadVC。在这种情况下,尝试将所有属性= nil的实体写入DB。

我看到这个错误。

Error Domain=NSCocoaErrorDomain Code=1560 "Multiple validation errors occurred."

对于每个必需的属性,例如

"Error Domain=NSCocoaErrorDomain Code=1570 \"firstProperty is a required value.\
UserInfo={NSValidationErrorObject=<APP.Entity: 0x600006917e80> (entity: Entity; id: 0x600000f152a0 <x-coredata:///Entity/t72AEC6D7-A854-40A3-BA9D-5830DFADC8AF2>; data: {\n    firstProperty = nil;\n    secondProperty = nil;\n}), NSValidationErrorKey = firstValue, NSLocalizedDescription=firstValue is a required value"
"Error Domain=NSCocoaErrorDomain Code=1570 \"secondProperty is a required value.\"

应该注意,在调用saveContext()之前,所有属性都已验证。

AddOrChangeEntityVC: UIViewController {
var entity: Entity?

func saveEntity() -> Bool {
        //validating data

        if !validateData() {
            return false
        }
        //creating passenger
        if entity == nil {

            entity = Entity()
        }
        //saving entity
        if let entity = entity {


            //saving
            entity.firstProperty    = firstPropertyTextfield.text!
            entity.secondProperty   = secondPropertyTextfield.text!
            ...
        CoreDataStack.shared.saveContext()
        return true
    }
 }
Entity: NSManaged

class Entity: NSManagedObject {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Entity> {
        return NSFetchRequest<Entity>(entityName: "Entity")
    }

    @NSManaged public var firstProperty:        String
    @NSManaged public var secondProperty:       String

    convenience init() {
        let entity = NSEntityDescription.entity(forEntityName: "Entity",
         in: CoreDataStack.shared.persistentContainer.viewContext)!
        self.init(entity: entity, insertInto: CoreDataStack.shared.persistentContainer.viewContext)
            } 
}

CoreData管理器

    class CoreDataStack {

    static var shared = CoreDataStack() 
    lazy var persistentContainer: NSPersistentContainer = {
    let container = NSPersistentContainer(name: "APP")
    container.loadPersistentStores { storeDesription, error in
          guard error == nil else {
              fatalError("Unresolved error \(error!)")
          }
      }

      // Merge the changes from other contexts automatically. useв for Another Entity
    enter code here
      container.viewContext.automaticallyMergesChangesFromParent = true
      container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
      container.viewContext.shouldDeleteInaccessibleFaults = true
      return container
  }()

    func saveContext() {
        let context = persistentContainer.viewContext
        guard context.hasChanges else { return }
        do {
            try context.save()
        } catch let error as NSError{
            print("Error: \(error), \(error.userInfo)")
        }
    }    
}

从anyVC过渡到AddOrChangeEntityVC

        guard let entityVC = self.storyboard?.instantiateViewController(withIdentifier: "addEntityVC") as? AddOrChangeEntityVC else {return}
        self.navigationController?.pushViewController(entityVC, animated: true)
    ```
swift xcode core-data nsmanagedobject nsmanagedobjectcontext
1个回答
0
投票

嗯,核心数据是模糊的,甚至是晦涩的。

我做了这个简单的步骤。1)在我添加的AddOrChangeEntityVC中

var context: NSManagedObjectContext = CoreDataStack.shared.persistentContainer.newBackGroundContext()

2)初始化实体:NSManaged(如果需要创建它)

if entity == nil {
    entity = Entity(context: context)
    }

3)意外地面临着在NSFetchingResultController结果中进行一些保存之后添加了具有所有属性的新的模糊实体== nil我在tableView(_ tableView:UITableView,numberOfRowsInSection部分:Int)中过滤了结果-> Int方法和tableView(_ tableView:UITableView ,cellForRowAt indexPath:IndexPath)->通过从fetchedResultsController.fetchedObjects中删除UITableViewCell?具有某些属性的元素== nil。

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  return fetchedResultsController.fetchedObjects?.filter({!$0.firstProperty.isEmpty}).count ?? 0 
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   if fetchedResultsController.object(at: indexPath).isValid {
        let entity = fetchedResultsController.object(at: indexPath)
        let cell = UITableViewCell()update(with: entity)
    ....
    }
© www.soinside.com 2019 - 2024. All rights reserved.