swift2 更新CoreData会添加许多nil值

yhuiod9q  于 2022-11-06  发布在  Swift
关注(0)|答案(1)|浏览(204)

我正在尝试实现一个自定义类来处理核心数据操作。当创建新值时,它工作得很好。但是当我想更新值时,我在核心数据中得到了空条目。以下是我目前为止的代码

/**
 Update all records in given entity that matches input records
 - parameters:
    - entityName: name of entity to fetch
    - updateBasedOnKey: name of key which will be used to identify entries that are going to be udpated
    - values: NSMutableArray of all elements that are going to be updated
 - important: if object with given updateBasedOnKey doesnt exist it will be created
 - returns: nothing
 */
func updateRecord(entity: String, updateBasedOnKey: String, values: NSMutableArray){
    let entityDescription = NSEntityDescription.entityForName(
        entity, inManagedObjectContext: self.managedObjectContext)
    let results = getRecords(entity)

    for(elements) in values{
        var newEntry = NSManagedObject(entity: entityDescription!, insertIntoManagedObjectContext: self.managedObjectContext)
        //Determine whether to add new result or update existing
        if(results.count > 0){
            for result in results{
                let entry = result as! NSManagedObject
                if let keyValueToCompare = entry.valueForKey(updateBasedOnKey){
                    if (keyValueToCompare.isEqual(elements.valueForKey(updateBasedOnKey)) ){
                        //asign newEntry to result if found in entries
                        newEntry = entry
                    }
                }
            }
        }
        //update entry with new values
        for(key, value) in elements as! NSMutableDictionary{
            newEntry.setValue(value, forKey: key as! String)
        }
        //Try to save resulting entry
        do {
            try newEntry.managedObjectContext?.save()
        } catch {
            print(error)
        }
    }
}

/**
 Fetch all records of given Entity in Core Data Model
 - parameters:
    - entityName: name of entity to fetch
 - returns: NSArray of all records in given entity
 */
func getRecords(entity:String) -> NSArray{
    let entityDescription = NSEntityDescription.entityForName(entity, inManagedObjectContext: self.managedObjectContext)
    let fetchRequest = NSFetchRequest()
    fetchRequest.entity = entityDescription

    var result = NSArray()

    do {
        result = try self.managedObjectContext.executeFetchRequest(fetchRequest)
    } catch {
        let fetchError = error as NSError
        print(fetchError)
    }
    return result
}

我认为问题出在将newEntry指定为NSManagedObject中。
有什么办法解决这个问题摆脱nils吗?
先谢谢你

**EDIT:**这是通过实现Wain建议创建的实际工作代码

func updateRecord(entity: String, updateBasedOnKey: String, values: NSMutableArray){
    let entityDescription = NSEntityDescription.entityForName(
        entity, inManagedObjectContext: self.managedObjectContext)
    let results = getRecords(entity)

    for(elements) in values{
        //set to true if value was already found and updated
        var newEntry : NSManagedObject?
        //Determine whether to add new result or update existing
        if(results.count > 0){
            for result in results{
                let entry = result as! NSManagedObject
                if let keyValueToCompare = entry.valueForKey(updateBasedOnKey){
                    if (keyValueToCompare.isEqual(elements.valueForKey(updateBasedOnKey)) ){
                        //asign newEntry to result if found in entries
                        newEntry = entry
                    }
                }
            }
        }
        if newEntry == nil {
            newEntry = NSManagedObject(entity: entityDescription!, insertIntoManagedObjectContext: self.managedObjectContext)
        }
        for(key, value) in elements as! NSMutableDictionary{
            newEntry!.setValue(value, forKey: key as! String)
        }
    }
}
alen0pnh

alen0pnh1#

你是对的,问题是你每次都在创建和插入一个新对象,而不是传递对象来更新,或者运行一个获取请求来找到它,然后更新它。
看起来你的意图是获取,而新条目应该只是一个引用,而不是初始化。所以:

var newEntry : NSManagedObject?

相关问题