【问题标题】:Not need to update object in Realm不需要更新领域中的对象
【发布时间】:2016-11-08 12:18:59
【问题描述】:

我尝试读取 json 并创建 Realm,所以我的代码:

    func workWithFileJSON () {
       //local file JSON
            let file = Bundle.main.path(forResource: "MobileDbSchema", ofType: "json")!
            let url = URL(fileURLWithPath: file)
            let jsonData = NSData(contentsOf: url)!

            //Parce JSON
            let json = try! JSONSerialization.jsonObject(with: jsonData as Data, options: [])

            try! realm.write {

//Create data from JSON to our objects
            realm.create(DataRoot.self, value: json, update: true)


           }     
    }

和带有类的文件:

import Foundation
import RealmSwift

class DataRoot: Object {
    dynamic var id = 0
    dynamic var name = ""
    let transport_type = List<Transport_type>()

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

class Transport_type: Object {
    dynamic var id = 0
    dynamic var name = ""
    let routes = List<Routes>()

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

class Routes: Object {
    dynamic var id = 0
    dynamic var name = ""
    let directions = List<Directions>()

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


class Directions: Object {
    dynamic var id = 0
    dynamic var name = ""
    dynamic var dayIdFrom = 0
    dynamic var dayIdTo = 0
    let stops = List<Stops>()

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

class Stops: Object {
        dynamic var id = 0
        dynamic var busStop: BusStop?
        let timetable = List<Timetable>()

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

class BusStop: Object {
        dynamic var id = 0
        dynamic var name = ""
        dynamic var descript = ""

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

class Timetable: Object {

        dynamic var hour = 0
        dynamic var minute = 0
        dynamic var group_index = 0
        dynamic var notes = ""

}

第一次运行后,我在 Realm 中看到了良好的数据:

但在第二次运行后,我在每次运行后看到Timetable x 2 等时间的数据。

在 Timetable 中没有主键(这里不需要)。为什么每次更新(运行)后我在Timetable 中看到增加的数据以及如何解决我的错误?

【问题讨论】:

  • 因为您在每次运行时都插入“新数据”。解决方案,如果已经添加了“新”数据,请不要在每次运行时插入。 Realm 会用主键解决这个问题,但你说你不需要它们。
  • 感谢您的回答,但是当我为时间表添加主键(dynamic var id = 0override class func primaryKey() -&gt; String? { return "id" } 时,我在结果表中只看到一个位置(并且必须是 1792)
  • 一个主键标识单个给定对象,这也意味着如果您为所有对象返回相同的 ID,那么您读入的所有对象都将被标识为该单个对象
  • @EpicPandaForce 谢谢,我会尝试为我的 JSON 创建主键(在我的 JSON 中为我的“时间表”创建“id”)

标签: ios swift xcode realm


【解决方案1】:

即使您的应用不需要主键,Realm.add(_:update:) 也需要您的 Object 类来实现一个,以便它能够识别预先存在的条目而不是新条目。如果不指定主键,即使 update: 设置为 true,它也会将 JSON 中的每一项添加为新对象。

理想情况下,您应该能够为 JSON 提要中的每个条目实现某种主 ID,这样您就可以简单地将其传递给 Realm。

但是,如果您无法实现主键,但您知道您下拉的每个新 JSON 对象都是您的时间表的完整快照,那么您也可以简单地考虑删除 Realm 文件中所有预先存在的时间表对象在从 JSON 文件中添加最新的之前。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多