2017-10-06 3 views
1

J'utilise le domaine en tant que backend. Je stocke deux chaînes. Le problème est quand j'insère les disques la première fois qu'il fonctionne parfaitement mais quand j'insère les dossiers encore une fois il montre une erreur.Impossible d'insérer un deuxième enregistrement dans la base de données de domaine

Mon 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 = "" 
} 
} 

Erreur:

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

Essayez cette https://stackoverflow.com/questions/30756349/realmswift-rlmexception – karthikeyan

Répondre

3

L'erreur se produit parce que vous ne disposez que d'un seul objet Msg créé. Ici:

let msg = Msg() 

Comme il est placé à l'extérieur d'une classe, il ne fera que créer une instance de Msg chaque fois que la classe englobante est instancié. Lorsque vous appuyez sur le bouton pour la première fois, tout est bon. msg est sauvegardé dans la base de données. Lorsque vous appuyez une deuxième fois sur le bouton, vous modifiez le même objet msg, qui se trouve déjà dans la base de données! Pour modifier quelque chose qui est déjà enregistré, vous devez placer le code dans un bloc write. Mais vous n'avez pas, donc l'exception se produit.

Ce que je pensais que vous vouliez faire était de créer un nouvel objet Msg chaque fois que le bouton est pressé. Pour ce faire, vous devez déclarer msg en tant que variable locale ou réaffecter msg dans IBAction.

@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

Merci beaucoup cela a fonctionné –