質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1362閲覧

RealmSwiftのデータ書き込み条件について

sunglass

総合スコア303

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/05/08 07:42

編集2020/05/08 09:38

idが0またはnullの時に書き込み(上書き含む)したいです。
filterにOR検索指定するもダメでした。。

『最初に書き込む』と『(一定の検索条件の結果)上書きする』はわけた方が良いのでしょうか・・・

イメージ説明

ViewController

1 let UserData = realm.objects(Obj.self).filter ("(id == 0) || (id == null)").first 2 3 try! realm.write { 4 UserData!.name = self.name.text 5 UserData!.target = self.target.text 6 }

Obj

1import Foundation 2import RealmSwift 3 4class Obj: Object{ 5 6 @objc dynamic var id = 0 7 @objc dynamic var name: String? 8 @objc dynamic var target: String? 9 10 override static func primaryKey() -> String? { 11 return "id" 12 } 13}

エラー内容
Thread 1: Exception: "Expected object of type int for property 'id' on object of type 'Obj', but received: (null)"

参考:https://teratail.com/questions/48049

【追記】
下記の形で一応自己解決は出来たのですがこれは正しいやり方なのでしょうか・・・?

ViewController

1 2...省略... 3 4@IBAction func saveButton(_ sender: UIButton) { 5 6 let realm = try! Realm() 7 8 // データベースの値を取得 9 let objs = realm.objects(Obj.self) 10 11 let obj = Obj() 12 13 // 値をセット 14 obj.name = textField.text 15 obj.target = Profiletextfield.text 16 17 // labelに表示 18 name.text = obj.name 19 Profile.text = obj.target 20 21 textField.text = "" 22 Profiletextfield.text = "" 23 24 // 上書き 25 DispatchQueue.main.async { 26 autoreleasepool { 27 28 let realm = try! Realm() 29 30 // DBにデータがない場合は書き込む 31 if(objs.count == 0){ 32 try! realm.write() { 33 realm.add(obj) 34 } 35 } else{ 36 // データベースに何か値がある場合はid=0を上書きする 37 let UserData = realm.objects(Obj.self).filter ("id == 0").first 38 39 try! realm.write { 40 UserData!.name = self.name.text 41 UserData!.target = self.Profile.text 42 } 43 } 44 } 45 } 46 47 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

@IBAction func saveButton(_ sender: UIButton) { let realm = try! Realm() // データベースの値を取得 let objs = realm.objects(Obj.self) let obj = Obj() // 値をセット obj.name = textField.text obj.target = Profiletextfield.text // labelに表示 name.text = obj.name Profile.text = obj.target textField.text = "" Profiletextfield.text = "" // 上書き DispatchQueue.main.async { autoreleasepool { let realm = try! Realm() // DBにデータがない場合は書き込む if(objs.count == 0){ try! realm.write() { realm.add(obj) } } else{ // データベースに何か値がある場合はid=0を上書きする let UserData = realm.objects(Obj.self).filter ("id == 0").first try! realm.write { UserData!.name = self.name.text UserData!.target = self.Profile.text } } } } }

投稿2020/05/08 11:25

sunglass

総合スコア303

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問