2017-10-06 1 views
1

Ich verwende Realm als mein Backend. Ich speichere zwei Strings. Das Problem ist, wenn ich die Datensätze zum ersten Mal einfüge, funktioniert es perfekt, aber wenn ich die Datensätze erneut einfüge, wird ein Fehler angezeigt.Kann den zweiten Datensatz in Realm-Datenbank nicht einfügen

Mein Code:

class ViewController: UIViewController ,UITableViewDelegate,UITableViewDataSource { 

@IBOutlet weak var tablee:UITableView! 
@IBOutlet weak var msgTxt:UITextView! 
@IBOutlet weak var img:UIImageView! 
@IBOutlet weak var vieww:UIView! 


let msg = Msg() 
let realm = try! Realm() 
lazy var msgs: Results<Msg> = { self.realm.objects(Msg.self) }() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    print(Realm.Configuration.defaultConfiguration.fileURL!) 
} 
@IBAction func msgSend(_ sendeR:UIButton) { 
    if img.image != nil { 
     let image : UIImage = self.img.image! 
     let imageData:NSData = UIImagePNGRepresentation(image)! as NSData 
     let strBase64 = imageData.base64EncodedString(options: .lineLength64Characters) 
     print(strBase64) 
     let pureStr = String(strBase64) 
     msg.imgurl = pureStr! 
    } else { 
     msg.imgurl = "none" 
    } 
    msg.content = msgTxt.text 
    let realm = try! Realm() 
    do { 
     try realm.write() { 
      realm.add(msg) 
     } 
    } catch { 

    } 
    self.tablee.reloadData() 
    self.msgTxt.text = "" 
} 
} 

Fehler:

Terminating app due to uncaught exception 'RLMException', reason: 'Attempting to modify object outside of a write transaction - call beginWriteTransaction on an RLMRealm instance first.

+0

Versuchen Sie, diese https://stackoverflow.com/questions/30756349/realmswift-rlmexception – karthikeyan

Antwort

3

Der Fehler tritt auf, weil Sie nur ein einziges Msg Objekt erstellt haben. Hier:

let msg = Msg() 

Da dies außerhalb einer Klasse platziert ist, wird es nur eine Instanz von Msg erstellen jedes Mal, wenn die umschließenden Klasse instanziiert wird.

Wenn Sie zuerst den Knopf drücken, ist alles gut. msg wird in der Datenbank gespeichert. Wenn Sie die Taste ein zweites Mal drücken, ändern Sie das gleiche msg Objekt, das bereits in der Datenbank ist! Um etwas zu ändern, das bereits gespeichert wurde, müssen Sie den Code in einen write Block setzen. Aber du hast es nicht getan, also tritt die Ausnahme auf.

Was ich denke, Sie beabsichtigten, ein neues Msg Objekt jedes Mal zu erstellen, wenn die Taste gedrückt wird. Um dies zu tun, müssen Sie msg als lokale Variable deklarieren oder msg in der IBAction neu zuweisen.

@IBAction func msgSend(_ sendeR:UIButton) { 
    msg = Msg() // this line creates a new Msg object so as not to modify the same one over and over. 
    if img.image != nil { 
     let image : UIImage = self.img.image! 
     let imageData:NSData = UIImagePNGRepresentation(image)! as NSData 
     let strBase64 = imageData.base64EncodedString(options: .lineLength64Characters) 
     print(strBase64) 
     let pureStr = String(strBase64) 
     msg.imgurl = pureStr! 
+0

Dank viel es funktionierte –

Verwandte Themen