该项目具有简约的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)
```
嗯,核心数据是模糊的,甚至是晦涩的。
我做了这个简单的步骤。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)
....
}