2016-08-05 31 views
0

Ich habe eine Funktion, wo ich ein payment und ein debt Objekt übergeben (beide sind Strukturen, die die Daten in meiner Realm-Datenbank). Ich möchte dann die payment an die paymentHistory der debt anhängen. Hier ist der Code, den ich für diesen Einsatz:Realm nicht persistent Änderungen im Schreiben

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 
    } 
} 

Bitte beachte, dass ich darunter bin den Code für die beiden Versuche, die ich gemacht habe, von denen keiner die Daten tatsächlich anhielt (Ich habe dies den Realm-Browser).

Beachten Sie auch, dass beim Debuggen kann ich sehen, dass die DBPayment erstellt wurde und ordnungsgemäß an die dbDebt Liste angehängt wurde. Vielleicht bin ich etwas fehlt offensichtlich, aber ich erwarte, dass dies im Reich, weil die Arbeit documentation, sie Folgendes angeben:

enter image description here

Für Referenz, hier sind die Definitionen meine structs und DB-Objekte:

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() 
    } 

} 

Antwort

2

Um Objekte im Realm persistent zu machen, müssen Sie die add() Funktion auf Ihrem Realm aufrufen (docs).

Folgendes sollte funktionieren:

try realm.write { 

    // this persists your dbPayment in your realm! 
    realm.add(dbPayment) 

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

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