2016-11-08 38 views
1

我嘗試讀取JSON和創建境界更新的對象,所以我的代碼:是不是需要在境界

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 = "" 

} 

我看到好的數據在境界:

enter image description here

但第二次運行後我看到Timetable×2數據等。每次運行後的時間。

enter image description here

在時間表沒有主鍵(在這裏並不需要它)。爲什麼在每次更新(運行)後,我看到Timetable中的增加數據以及如何解決我的錯誤?

+0

因爲您要在每次運行中插入「新數據」。解決方法:如果已經添加了,請不要在每次運行中插入「新」數據。 Realm會用主鍵解決這個問題,但你說你不需要它們。 – EpicPandaForce

+0

謝謝你的回答,但是當我添加主鍵('dynamic var id = 0'和'override class func primaryKey() - > String?{ return'id' }'時間表時,我看到結果中只有一個位置表(並且必須是1792) –

+0

一個主鍵可以識別單個給定對象,這也意味着如果您爲所有對象返回相同的ID,那麼您讀入的所有對象將被識別爲該單個對象 – EpicPandaForce

回答

2

即使您的應用不需要主鍵,Realm.add(_:update:)也需要您的Object類實現一個,以便能夠識別預先存在的條目而不是新的條目。如果您未指定主鍵,即使update:設置爲true,它也會將來自JSON的每個項目添加爲新對象。

理想情況下,您應該能夠爲JSON訂閱源中的每個條目實現某種主ID,以便將其傳遞給Realm。然而,如果你不能實現主鍵,但你知道每個你下拉的新JSON對象都是你的時間表的完整快照,那麼你也可以簡單地考慮刪除你的Realm中所有預先存在的時間表對象文件,然後再從JSON文件中添加最新的文件。