2016-11-08 4 views
1

Я стараюсь читать JSON и создать Realm, поэтому мой код:Не нужно обновить объект в 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:

enter image description here

но после второго запуска я вижу данные в Timetable х 2 и т. д. после каждого прогона.

enter image description here

В Расписании нет первичных ключей (здесь не нужно). Почему после каждого обновления (запуска) я вижу увеличение данных в Timetable и как решить мою ошибку?

+0

Потому что вы вставляете «новые данные» в каждый прогон. Решение, не вставляйте «новые» данные в каждый прогон, если он уже добавлен. Царство решило бы это с помощью первичных ключей, но вы сказали, что они вам не нужны. – EpicPandaForce

+0

спасибо за ответ, но когда я добавляю первичный ключ ('dynamic var id = 0' и' override class func primaryKey() -> String? { return "id" } 'для расписания я вижу только одну позицию в результате (и должно быть 1792) –

+0

Ну, первичный ключ идентифицирует один заданный объект, что также означает, что если вы вернете одинаковый идентификатор для всех объектов, тогда все объекты, которые вы читаете, будут идентифицированы как один объект. – EpicPandaForce

ответ

2

Даже если вашему приложению не нужны первичные ключи, Realm.add(_:update:) требует, чтобы ваш класс Object реализовал его, чтобы он мог идентифицировать ранее существовавшие записи, а не новые. Если вы не укажете первичный ключ, даже если update: установлен в true, он добавит каждый элемент из JSON в качестве нового объекта.

В идеале вы должны иметь возможность реализовать какой-то первичный идентификатор для каждой записи в канале JSON, чтобы вы могли просто передать это вместе с Realm.

Однако, если вы не можете реализовать первичные ключи, но вы знаете, что каждый новый объект JSON, который вы вытаскиваете, представляет собой полный снимок ваших расписаний, тогда вы также можете просто удалить все ранее существовавшие объекты расписания в своем Царстве файл перед добавлением последних из файла JSON.