核心数据 - 根据参数插入

时间:2014-11-19 15:47:30

标签: ios objective-c core-data swift

我有一个名为Person的表。 如何进行基于名称的数据输入,而不是重复名称。

示例:

  我有一个名叫约什的人。不能让另一个人叫Josh。

类似PK的功能。

2 个答案:

答案 0 :(得分:1)

嗯,CoreData没有内置主键的逻辑。实际上CoreData管理可以持久存在的对象图,但严格来说并不是ORM。

因此,您必须发出请求(使用NSFetchRequest)来获取带有名字Josh的对象,如果没有,您将添加它,否则您可以更新它。

可以在代码中构建安全性,以使用validateForInsert,validateForUpdate等强制执行该unicity规则。 https://developer.apple.com/library/mac/Documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObject_Class/index.html#//apple_ref/occ/instm/NSManagedObject/validateForInsert

答案 1 :(得分:1)

不幸的是,CoreData没有内置的方法来防止欺骗。

首先,使用谓词执行获取请求以查看该值是否存在。如果它不存在,则插入新实体。

实施例)

    let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
    let managedContext = appDelegate.managedObjectContext!
    let personName = "Josh"

    let fetchRequest = NSFetchRequest(entityName: "Person")
    let predicate = NSPredicate(format: "name = %@", personName)
    fetchRequest.predicate = predicate

    var error: NSError?
    let fetchedResults = managedContext.executeFetchRequest(fetchRequest, error: &error) as [NSManagedObject]?

    if let results = fetchedResults {
        // if no results found, then insert
        if results.count == 0 {
            let entity =  NSEntityDescription.entityForName("Person", inManagedObjectContext: managedContext)
            let person = Person(entity: entity!, insertIntoManagedObjectContext:managedContext)
            person.setValue(personName, forKey: "name")

            var error: NSError?
            if !managedContext.save(&error) {
                println("Could not save \(error), \(error?.userInfo)")
            }
        }

    } else {
        println("Could not fetch \(error), \(error!.userInfo)")
    }