【问题标题】:RealmSwift + Duplicates of DataRealmSwift + 数据重复
【发布时间】:2015-12-07 08:30:28
【问题描述】:

我在避免重复写入领域数据库的数据方面存在一些问题。我有以下对象模型

Person.swift

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

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

狗.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 未重新创建人员数据,这按我的预期工作,但狗的名字不断重复。所以我的问题是,如果人没有被覆盖,为什么还要添加狗名,我哪里做错了?

【问题讨论】:

  • 那是因为 Dog 没有主键,因此会阻止您在每次要更新人时创建一个 dog 对象。
  • 谢谢回复!那么考虑到 json 文件没有狗的主键,你对解决这个问题有什么建议吗?
  • 当然,请找到答案。您将需要检查人是否存在,如果存在,请不要创建和添加狗。

标签: json swift realm


【解决方案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"
}

【讨论】:

  • 我收到此错误'RLMException',原因:'主键的值'id'无效'
  • 哦,应该是personId。编辑了答案。
  • 非常感谢!奇迹般有效!我一直在尝试搜索该主键语法近一周哈哈。 PS:只是为了确认一下,我是否正确地说,如果我稍后更新我的 json 文件,我将永远不会仅用这段代码来更新它。
  • 如果您的 JSON 发生变化,例如“Joe”有一个新的Dog“Rex”,则不会添加。
  • 在这种情况下,您将需要能够检查某某狗对象是否存在,如果不存在,则仅添加它。马吕斯的回答中有暗示。
【解决方案2】:

另一个解决方案可能是向链接类Dog 添加一个主键。但是,如果那是狗的名字,那将导致另一个 Person 拥有一只同名的狗,将共享相同的 Dog 实例,这取决于您的实际用例,这可能仍然是一个足够的解决方案。

【讨论】:

  • 狗数据没有主键,狗的名字也不会被删减,所以我想我必须找到另一个与更新检查有关的解决方案。谢谢回复!欣赏它!
  • 已经有一段时间了,但是如果我的 json 数据随着 Dog Object 的更改而更新,我仍然无法找到解决方案。需要一些认真的帮助例如,如果 Jim(有主键)曾经有 3 条狗,但现在剩下两条狗,我如何删除 Jim 的狗值并重新插入 2 条狗的更改而不影响其他人对象与他们自己的狗的关系?
  • @Delonn:您将需要手动处理新的相关项目并将它们与旧项目进行比较。应该保留的,可以保留并收集到一个列表中,而那些不再需要的,可以直接删除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-10
相关资源
最近更新 更多