実現したいこと・前提
ユーザーが画面を離れたらその時点で書かれているデータを保存し、再度その画面(CleanViewController)に戻ってきたらまた新しくデータを打ち込めるようなアプリを作っています。
プライマリーキーをIDにしていて、画面を離れる瞬間(viewWillDisappear)で現時点で最大のIDを取得し、その値に1を足しています。
発生している問題・エラーメッセージ
CleanViewController内のTextViewに文字を打ち込む→画面を離れデータを保存させる→再度CleanViewControllerのTextViewにテキストを入れる→画面を離れる
このような処理をした際下記のようなエラーが出てしまいます。
1回目のデータを保存させる処理は上手くいっているのですが、再度CleanViewControllerに戻り保存させようとするとうまくいかないです。
Primary key can't be changed after an object is inserted
該当のソースコード
Swift
1class CleanViewController: UIViewController { 2 @IBOutlet weak var textField: UITextField! 3 let realm = try! Realm() 4 let clean = Clean() 5 var postResults = try! Realm().objects(Post.self).sorted(byKeyPath: "date", ascending: false) 6 7 override func viewWillAppear(_ animated: Bool) { 8 textField.text = "" 9 } 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 } 14 15 override func viewWillDisappear(_ animated: Bool) { 16 let date = Date() 17 if textField.text!.isEmpty == false { 18 let allPosts = realm.objects(Clean.self) 19 if allPosts.count != 0{ 20 print(clean.id) 21 clean.id = allPosts.max(ofProperty: "id")! + 1 22 print(clean.id) 23 } 24 try! realm.write{ 25 self.clean.cleanMessage = textField.text! 26 self.clean.date = date 27 self.realm.add(self.clean, update: .modified) 28 } 29 } 30 } 31}
Swift
1class Clean: Object{ 2 @objc dynamic var id = 0 3 @objc dynamic var cleanMessage = "" 4 @objc dynamic var date = Date() 5 override static func primaryKey() -> String? { 6 return "id" 7 } 8}
試したこと
ViewWillDisappearの中でclean.idをデバッグさせました
2周目の処理(CleanViewController内のTextViewに文字を打ち込む→画面を離れデータを保存させる→再度CleanViewControllerのTextViewにテキストを入れる→画面を離れる)の際、idの最大の数に1を足す処理の前はデバッグされるのですが、その後のデバッグがされていないので、あくまでも予測なのですが、
clean.id = allPosts.max(ofProperty: "id")! + 1
この箇所に問題があるのではないかと思います
あやふやな知識で申し訳ないのですがご教授頂けますと幸いです
よろしくお願いします
補足情報(FW/ツールのバージョンなど)
Realm・Swift・Xcodeは最新バージョンです
回答1件
あなたの回答
tips
プレビュー