覆盖核心数据值

Posted

技术标签:

【中文标题】覆盖核心数据值【英文标题】:Overwrite on Core Data value 【发布时间】:2017-02-17 09:37:35 【问题描述】:

你好,我需要覆盖CoreData 上的值(如果已经存在)。例如,如果已经在 CoreData 我有 Josh 我需要删除它,然后保存新的 Josh

func save(value:String, forkey:String) 
    let context = getContext()
    let entity = NSEntityDescription.entity(forEntityName: "Lastname", in: context)

    let add = NSManagedObject(entity: entity!, insertInto: context)
    add.setValue(value, forKey: forkey)

    do 
        try context.save()
        print("save ->  \(value)")
     catch 
        print("err \(error)")
    

【问题讨论】:

看看这个教程raywenderlich.com/145809/getting-started-core-data-tutorial。所有基本方法都在那里得到了很好的描述和实现。 如果在核心数据中找到值,您的意思是更新值吗???? @Adi 是的,对不起 ;) 检查 -> 如果找到删除并保存 -> 如果不只保存 首先,您必须检查该值是否在数据库中。如果存在,则可以更新它,如果不存在,则可以添加它。 @Adi 好的,但我该如何检查? if add.value(forKey: forkey) == value ? 【参考方案1】:

我们可以检查值是否存在。然后更新并在数据库中创建值

class func checkAndUpdateAtIndex(entry_id: String, comment_text: String, comment_name: String, comment_pic: String, comment_date: String, comment_id: String, comment_isDeleted: String, comment_userid: String) 
    let context: NSManagedObjectContext = DataAccess.shared.managedObjectContext
    let request = NSFetchRequest(entityName: "Comment")
    request.predicate = NSPredicate(format: "comment_id = %@", comment_id)

    if let fetchResults = (try? DataAccess.shared.managedObjectContext.executeFetchRequest(request)) as? [NSManagedObject] 
        if fetchResults.count != 0
            //update value
            var managedObject = fetchResults as! [Comment]
            managedObject[0].setValue(entry_id, forKey: "entry_id")
            managedObject[0].setValue(comment_text, forKey: "comment_text")
            managedObject[0].setValue(comment_name, forKey: "comment_name")
            managedObject[0].setValue(comment_pic, forKey: "comment_pic")

        else   
            // create new entity if not found
            let newItems = NSEntityDescription.insertNewObjectForEntityForName("Comment", inManagedObjectContext: context) as! Comment

            newItems.entry_id = entry_id
            newItems.comment_text = comment_text
            newItems.comment_name = comment_name
            newItems.comment_pic = comment_pic            
        


            do 
                try context.save()
             catch 
    

在此更新方法中,我首先获取我们要更新的实体,然后在该位置存储新值。

【讨论】:

【参考方案2】: 获取对象。 创建一个新对象(如果没有)。 更新属性。 保存上下文。
func save(value:String, for key:String) 
    let context = getContext()
    let request = NSFetchRequest(entityName: "Lastname")
    let predicate = NSPredicate(format:"%K == %@", value, key)
    request.predicate = predicate
    do 
       let fetchResults = try context.executeFetchRequest(request)
       let object : NSManagedObject 
       if fetchResults.isEmpty 
          let entity = NSEntityDescription.entity(forEntityName: "Lastname", in: context)
          object = NSManagedObject(entity: entity!, insertInto: context)
        else 
          object = fetchResults[0]
       

       object.setValue(value, forKey: key)

       try context.save()
       print("save ->  \(value)")
     catch 
        print("err \(error)")
    

注意:我不再使用 Swift 2,可能会出现编译器错误。

【讨论】:

它可以工作,但如果值不在实体中,则会出错,因为“在实体中找不到”

以上是关于覆盖核心数据值的主要内容,如果未能解决你的问题,请参考以下文章

为多对多关系覆盖核心数据设置器方法

dotnet 测试 - 覆盖 .net 核心配置的可能性

使用环境变量覆盖核心 Magento DB 连接

如何覆盖核心数据中的数据?如何解决Core Data中的重复数据?

不是常见的覆盖率标准

在 Redmine 核心视图中添加额外的 SQL 查询(插件中的覆盖视图)