Core data Swift 3 iOS10核心数据根据id检查记录是否已存在

Core data Swift 3 iOS10核心数据根据id检查记录是否已存在,core-data,swift3,Core Data,Swift3,我正在iOS10上开发一个新的CoreData和Swift3应用程序。只有当id不存在时,我们如何创建新对象(如果对象已经存在,我们从核心数据中取出对象并仅修改它) 差不多 let objectID = someNumber If exist with objectID = someNumber { //modify object }else { //create new object //assign attribute } //save 我正在尝试对CoreData使

我正在iOS10上开发一个新的CoreData和Swift3应用程序。只有当id不存在时,我们如何创建新对象(如果对象已经存在,我们从核心数据中取出对象并仅修改它)

差不多

let objectID = someNumber

If exist with objectID = someNumber {
   //modify object
}else {
   //create new object
   //assign attribute
}

//save
我正在尝试对CoreData使用新的iOS10 Swift 3语法。我使用的是本机代码,而不是任何第三方库。考虑使用fetch,但不知道此任务的正确语法是什么

更新:感谢@Jan,我找到了检查的方法。我的更新问题是从给定的JSON创建或更新实体。这是我的功能

static func creatOrUpdateArticle(_ json: JSON, context: NSManagedObjectContext) ->Article {

        var article: Article

        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Article")
        let predicateID = NSPredicate(format: "id == %@",json[Key.id].stringValue)
        fetchRequest.predicate = predicateID

        do {

            let results = try context.fetch(fetchRequest)
            if results.count > 0 {
                article = results.first as! Article
            }else {
                article = Article(context: context)
            }

            article.webUrl = json[Key.webUrl].string


        }
        catch let error {
            print(error.localizedDescription)
        }
        return article
    }
static func creatOrUpdateArticle(json:json,context:NSManagedObjectContext)->文章{
var文章:文章
let fetchRequest=NSFetchRequest(entityName:“Article”)
让predicateID=NSPredicate(格式:“id==%@”,json[Key.id].stringValue)
fetchRequest.predicate=predicateID
做{
let results=try context.fetch(fetchRequest)
如果results.count>0{
article=结果。第一个为!article
}否则{
文章=文章(上下文:上下文)
}
article.webUrl=json[Key.webUrl].string
}
捕捉错误{
打印(错误。本地化描述)
}
退货
}

我得到一个错误:“在初始化之前使用变量项目”。如何使函数返回文章或更新现有文章并返回结果?

我假设您知道如何创建和修改对象。对于缺少的
存在部分
可以使用如下内容:

func someEntityExists(id: Int) -> Bool {
    var fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "SomeEntity")
    fetchRequest.predicate = NSPredicate(format: "someField = %d", id)

    var results: [NSManagedObject] = []

    do {
        results = try managedObjectContext.fetch(fetchRequest)
    }
    catch {
        print("error executing fetch request: \(error)")
    }

    return results.count > 0
}

有一点提示,您可以重写以下内容:

if results.count > 0 {
    article = results.first as! Article
}else {
    article = Article(context: context)
}
作为:


谢谢你这么做。新的语法是“let fetchRequest=NSFetchRequest(entityName:“Article”)”而不是fetchRequest=NSFetchRequest(entityName:“SomeEntity”)?@LêKhánhVinh啊对不起,我误解了你的意思。。。我已经更新了我的答案。我可能会使用一个可选的,因为核心数据操作可能会失败,导致您无法返回任何内容。在第二个示例中,您在哪里使用了“id”?在第二个示例中,您可能忘了使用id的谓词行?
if results.count > 0 {
    article = results.first as! Article
}else {
    article = Article(context: context)
}
let article = results.first as? Article ?? Article(context: context)