Realm и Objectmapper: массив из одного элемента продолжает накапливаться в моей базе данных Realm для каждого запроса

Это продолжение одного из моих предыдущие вопросы здесь. Мне нужно было сопоставить массив types в моей базе данных Realm, который состоит только из одного слова (иногда двух), с помощью ObjectMapper.

Это JSON:

{
  "result": [
    {
      "id": 20,
      "types": [
        "now"
      ],
      "url": "/nl/whereto/ezrhgerigerg"
    },

Я получил следующий обходной путь, который частично сработал:

func mapping(map: Map) {
...
var typez: [String]? = nil
typez <- map["types"]

typez?.forEach { t in
    let obj = getType()
    obj.text = t
    self.typez.append(obj)
}

И мой класс getType(), который является объектом:

class getType: Object, Mappable {
    dynamic var text: String?

    required convenience init?(_ map: Map) {
        self.init()
    }

    func mapping(map: Map) {
        text <- map[""]
    }
}

Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я вызываю бэкэнд, база данных не обновляет данные в типах (или удаляет их и захватывает новые), она просто накапливает их! Это делает мою базу данных getType более чем 280 строками после некоторых вызовов, в то время как она присутствует только в 10 объектах.

После x количества вызовов серверной части это вызовет серьезную проблему. Кто-нибудь знает, что мне делать?


person SoundShock    schedule 10.05.2016    source источник


Ответы (1)


Я думаю, вы, вероятно, обновили объект Publication, используя первичный ключ. К сожалению, объект getType не имеет первичного ключа. Он не может быть обновлен автоматически с помощью первичного ключа.

Таким образом, вы можете удалить свойство typez вручную, если объект публикации уже существует. Как следующее:

let publication = Mapper<Publication>().map(json)
// ...
try! realm.write {
    // Check whether the Publication object already exists
    let key = ... // Primary key value (e.g. 20)
    if let publication = realm.objectForPrimaryKey(Publication.self, key: key) {
        // If it already exists, delete `typez` objects
        realm.delete(publication.typez)
    }

    realm.add(publication, update: true)
}
person kishikawa katsumi    schedule 16.05.2016
comment
возвращает следующую ошибку: неперехваченное исключение 'RLMException', причина: 'Недопустимое значение' id 'для первичного ключа' - person SoundShock; 17.05.2016
comment
@SoundShock Извините, это моя вина. Параметр key неверен. Значение первичного ключа должно быть передано параметру key, например 20. Я отредактировал свой ответ. - person kishikawa katsumi; 17.05.2016