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

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

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

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

Q&A

解決済

2回答

548閲覧

[SwiftUI] Realmで条件数が可変な場合のデータ検索

bakubaku

総合スコア6

Realm

RealmとはSQLiteやCore Dataに代わるモバイルデータベースです。iOSとAndroidの両方でサポートされています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

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

Swift

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

0グッド

0クリップ

投稿2022/12/15 05:09

実現したいこと

SwiftUIでiOSアプリを作成しています。
Realmでデータ検索を行う際に、条件数が可変となる場合の手段について悩んでおります。

Viewに、それぞれに対応したTextFieldやToggleButton等があり、
id_TextFieldにのみ入力がある場合は、idのフィルターでのみ検索。
id_TextFieldとname_TextFieldに入力がある場合は、idとnameでフィルターをかけたい。
このように、ユーザーが入力した状態によって、フィルターの条件を変更したいのですが、
うまいやり方が思いつきません。
条件分岐で分けるしか方法がありませんでしょうか。
条件が複数あり、あまり現実的でなく感じております。。
何かお分かりであればご教示ください。

Swift

1//下記のようになる・・? 2class Shop: Object { 3 @Persisted var id = 0 4 @Persisted var name = "" 5 @Persisted var isFavorite = false 6} 7 8if(id_TextField != ""){ 9 let array = try! Realm().objects(Shops).filter('id == %@', id) 10}else if(id_TextField != "")&&(name_TextField != ""){ 11 let array = try! Realm().objects(Shops).filter('id == %@ && name == %@', id, name) 12}else if...

補足情報(FW/ツールのバージョンなど)

Realm:Bundle version string (short) 10.33.0
Realm Swift:Bundle version string (short) 10.33.0
Xcode 14.1(14B47b)

CPU:Apple M1
OS:Venture 13.0.1

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

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

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

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

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

guest

回答2

0

ベストアンサー

ユーザーが自由に入力した文字を検索する際は、 %@ を使って検索文字を埋め込む方法で検索することをお勧めします。

それで、filterメソッドは、一度filterを適用した結果に対して追加適用できますので、次のように文字が入力されているものを少しずつ検索条件に加えて検索していけば良いと思います。

swift

1var array = try! Realm().objects(Shops) 2if id_TextField != "" { 3 array = array.filter('id == %@', id_TextField) 4} 5if name_TextField != "" { 6 array = array.filter('name == %@', name_TextField) 7}

投稿2022/12/16 01:51

TakeOne

総合スコア6299

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

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

uni2

2022/12/16 02:48

先に回答していた uni2 です。 こちらの回答の方が Good ですね。 こちらとしても大変勉強になりました。ありがとうございます。
bakubaku

2022/12/16 05:27

ご回答いただきありがとうございます。 filterメソッドが、一度filterを適用した結果に対して追加適用できるとは目から鱗でした。 この度もありがとうございました。
guest

0

提示頂いたソースは 11 行目に到達しないかもしれません。
10 行目の条件式を満たす場合
8 行目の条件式を同時に満たすため
先に 9 行目に到達してしまいます。

8 行目の条件式としては
if (id_TextField != "" && name_TextField == "" && isFavorite_CheckBox == false)
等が適切かもしれません。

さて、提案ですが
String の配列を作って
条件式を append していって
最後に String に結合するのはどうでしょうか?

こうすれば条件式が増えても
苦労しないと思われます。

申し訳ございませんが
動作チェックを行っておりません。
ご容赦下さい。

また、他の方の意見も是非ご参考下さい。

Swift

1class Shop: Object { 2 @Persisted var id = 0 3 @Persisted var name1 = "" 4 @Persisted var name2 = "" 5 @Persisted var name3 = "" 6 @Persisted var name4 = "" 7} 8 9var conditions: [String] = [] 10if(id_TextField != ""){ 11 conditions.append("id == " + id_TextField) 12} 13if(name1_TextField != ""){ 14 conditions.append("name1 == " + name1_TextField) 15} 16if(name2_TextField != ""){ 17 conditions.append("name2 == " + name2_TextField) 18} 19if(name3_TextField != ""){ 20 conditions.append("name3 == " + name3_TextField) 21} 22if(name4_TextField != ""){ 23 conditions.append("name4 == " + name4_TextField) 24} 25 26var callCondition = "" 27ForEach(0 ..< conditions.count) { index in 28 callCondition += conditions[index] 29 if index < conditions.count - 1 { 30 callCondition += " && " 31 } 32} 33 34let array = try! Realm().objects(Shops).filter(callCondition)

投稿2022/12/15 05:49

uni2

総合スコア252

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

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

bakubaku

2022/12/16 00:16

ご回答ありがとうございます。 ご教示いただいた方法ですとスマートですね。 まだ試せていないのですが、試してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問