我使用领域作为我的后端。我存储两个字符串。问题是当我第一次插入记录时它完美地工作但是当我再次插入记录时它显示错误。
我的代码:
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 = ""
}
}
错误:
由于未捕获的异常'RLMException'而终止应用程序,原因:'尝试修改写事务之外的对象 - 首先在RLMRealm实例上调用beginWriteTransaction。
答案 0 :(得分:3)
发生错误是因为您只创建了一个Msg
个对象。这里:
let msg = Msg()
由于它位于类之外,因此每次实例化封闭类时,它只会创建一个Msg
实例。
当您第一次按下按钮时,一切都很好。 msg
保存到数据库中。当您再次按下该按钮时,您正在修改已存在于数据库中的同一msg
对象!要修改已保存的内容,您需要将代码放在write
块中。但你没有,所以发生异常。
我认为你打算做的是每次按下按钮时创建一个新的Msg
对象。为此,您需要将msg
声明为局部变量,或在IBAction中重新分配msg
。
@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!