Область, не сохраняющая изменения, сделанные при записи

У меня есть функция, в которой я передаю объект payment и debt (оба являются структурами, представляющими данные в моей базе данных Realm). Затем я хочу добавить payment к paymentHistory из debt. Вот код, который я использую для этого:

static func savePayment(payment: Payment, forDebt debt: Debt) throws {
  let realm = try Realm()
  let predicate = NSPredicate(format: "created = %@", debt.created)
  guard let dbDebt = realm.objects(DBDebt.self).filter(predicate).first else { fatalError("no debt found in DB for payment") }
  let dbPayment = DBPayment(payment: payment)
  try realm.write {

    // first try
    // dbDebt.paymentHistory.append(dbPayment)

    // second try
    let newPaymentHistory = dbDebt.paymentHistory
    newPaymentHistory?.append(dbPayment)
    dbDebt.paymentHistory = newPaymentHistory
  }
}

Обратите внимание, что я включаю код для двух предпринятых мной попыток, ни одна из которых фактически не сохранила данные (я проверил это с помощью браузера Realm).

Также обратите внимание, что при отладке я вижу, что DBPayment был создан и правильно добавлен в список dbDebt. Возможно, я упускаю что-то очевидное, но я ожидаю, что это сработает, потому что в Realm документация, они утверждают следующее:

введите здесь описание изображения

Для справки вот определения моих структур и объектов БД:

class DBDebt: Object {

  dynamic var amount: Double = 0.0
  dynamic var owner: DBPerson? = DBPerson()
  var paymentHistory: List<DBPayment>? = List<DBPayment>()
  dynamic var currency: String = Currency.Dollar.rawValue
  dynamic var created: NSDate = NSDate()
  dynamic var deadline: NSDate? = nil

  init(debt: Debt) {
    self.amount = debt.amount
    self.owner = DBPerson(person: debt.owner)
    self.paymentHistory = debt.paymentHistory.reduce(List<DBPayment>()) { (list: List<DBPayment>, payment: Payment) in
      list.append(DBPayment(payment: payment))
      return list
    }
    self.currency = debt.currency.rawValue
    self.created = debt.created
    self.deadline = debt.deadline
    super.init()
  }

  required init(value: AnyObject, schema: RLMSchema) {
    super.init(value: value, schema: schema)
  }

  required init(realm: RLMRealm, schema: RLMObjectSchema) {
    super.init(realm: realm, schema: schema)
  }

  required init() {
    super.init()
  }

}

class DBDebt: Object {

  dynamic var amount: Double = 0.0
  dynamic var owner: DBPerson? = DBPerson()
  var paymentHistory: List<DBPayment>? = List<DBPayment>()
  dynamic var currency: String = Currency.Dollar.rawValue
  dynamic var created: NSDate = NSDate()
  dynamic var deadline: NSDate? = nil

  init(debt: Debt) {
    self.amount = debt.amount
    self.owner = DBPerson(person: debt.owner)
    self.paymentHistory = debt.paymentHistory.reduce(List<DBPayment>()) { (list: List<DBPayment>, payment: Payment) in
      list.append(DBPayment(payment: payment))
      return list
    }
    self.currency = debt.currency.rawValue
    self.created = debt.created
    self.deadline = debt.deadline
    super.init()
  }

  required init(value: AnyObject, schema: RLMSchema) {
    super.init(value: value, schema: schema)
  }

  required init(realm: RLMRealm, schema: RLMObjectSchema) {
    super.init(realm: realm, schema: schema)
  }

  required init() {
    super.init()
  }

}


struct Payment {

  init(amount: Double, paymentDate: NSDate = NSDate()) {
    self.amount = amount
    self.paymentDate = paymentDate
  }

  let amount: Double
  let paymentDate: NSDate

}

class DBPayment: Object {

  dynamic var amount: Double = 0.0
  dynamic var paymentDate: NSDate = NSDate()

  init(payment: Payment) {
    self.amount = payment.amount
    self.paymentDate = payment.paymentDate
    super.init()
  }

  required init(value: AnyObject, schema: RLMSchema) {
    super.init(value: value, schema: schema)
  }

  required init(realm: RLMRealm, schema: RLMObjectSchema) {
    super.init(realm: realm, schema: schema)
  }

  required init() {
    super.init()
  }

}

person nburk    schedule 05.08.2016    source источник


Ответы (1)