首页 文章

RealmSwift重复数据

提问于
浏览
2

我对避免写入realm数据库的数据重复有一些问题 . 我有以下对象模型

Person.swift

class Person: Object {
    let id = RealmOptional<Int>()
    dynamic var name = ""
    let dogs = List<Dog>()

    override static func primaryKey() -> String {
        return "id" 
    }
}

Dog.swift

class Dog: Object {
    dynamic var name = ""
    var owner: [Person] {
        return linkingObjects(Person.self, forProperty: "dogs")
}

而Json的数据是

{
  "id": 1001,
  "name": "Joe",
  "dogs": ["Sally","Molly","Lucy"]
}

在将json数据解析为变量 - personId,personName和dogNameArray之后,将这些数据发送到saveFunc()

func saveFunc() {

do {
    let newPerson = Person()
    newPerson.id.value = personId
    newPerson.name = personName

    let newDog = Dog()
    if dogNameArray.count > 0 {
    for dog in dogNameArray {
        newDog.name = dog
        newPerson.dog.append(newDog)
      }
    }

    let realm = try Realm()
    realm.beginWrite()
    realm.create(Person.self, value: newPerson, update: true)
    try realm.commitWrite()

} catch {
    print("create and updating error"
}

问题:数据是第一次创建的,但随后重新启动应用程序,由于primaryKey没有重新创建人员数据,这是我的意图,但狗名称保持重复 . 所以我的问题是,如果这个人没有被覆盖,为什么狗名仍然被添加,我做错了哪里?

2 回答

  • 1

    我们可以确保,我们检查该人是否已经存在,如果是,则不要创建和添加狗:

    func saveFunc() {
    
      do {
    
        let realm = try Realm()
        if let person = realm.objectForPrimaryKey(Person.self, key: personId){
           //Nothing needs be done.
    
        }else {
    
           //Create Person and dogs and relate them.
    
          let newPerson = Person()
          newPerson.id.value = personId
          newPerson.name = personName
    
          let newDog = Dog()
          if dogNameArray.count > 0 {
            for dog in dogNameArray {
              newDog.name = dog
              newPerson.dog.append(newDog)
            }
          }
    
          let realm = try Realm()
          realm.beginWrite()
          realm.create(Person.self, value: newPerson, update: true)
          try realm.commitWrite()
        }
    
    
      } catch {
        print("create and updating error"
    }
    
  • 1

    另一个解决方案可能是将主键添加到链接类 Dog . 但是,如果这将是狗的名字,这将导致另一个 Person 有一个同名的狗,将共享相同的 Dog 实例,这取决于你的真实用例,可能仍然是一个适当的解决方案 .

相关问题