Swift 3 iOS10核心数据检查记录是否已存在基于id

时间:2017-06-20 16:13:32

标签: 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 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
    }

我收到错误:&#34;变量文章在初始化之前使用&#34;。我们如何使函数返回文章或更新现有文章并返回结果?

2 个答案:

答案 0 :(得分:14)

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

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
}

这种新的更有效的方法是使用NSFetchRequestResult

func someEntityExists(id: Int) -> Bool {
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "SomeEntity")
    fetchRequest.includesSubentities = false

    var entitiesCount = 0

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

    return entitiesCount > 0
}

答案 1 :(得分:2)

小提示,您可以重写以下内容:

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

为:

let article = results.first as? Article ?? Article(context: context)