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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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

解決済

1回答

335閲覧

Realm SwiftでDBを更新するとフィルターが解除されてしまう

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クリップ

投稿2023/01/19 12:09

前提

・フィルタをかけたRealmのDBをForEachで表示させている。
RealmSwiftを活用している。
・フィルターの内容は可変です。

実現したいこと

フィルターをかけたまま、DBの更新をしたい。

発生している問題・エラーメッセージ

フィルタをかけたRealmのDBをForEachで表示させているのですが、
DBの更新をすると、フィルターが解除されてしまいます。

該当のソースコード

swift

1 struct PersonView: View { 2 3 @ObservedResults(Person.self) var personGroups 4 @EnvironmentObject var viewModel: ViewModel 5 6 @State var arr:[String] = [] 7 8 let columns = [GridItem(.flexible(minimum: 10,maximum: .infinity), spacing: 0), 9 GridItem(.flexible(minimum: 10,maximum: .infinity), spacing: 0), 10 GridItem(.flexible(minimum: 10,maximum: .infinity), spacing: 0), 11 GridItem(.flexible(minimum: 10,maximum: .infinity), spacing: 0), 12 GridItem(.flexible(minimum: 10,maximum: .infinity), spacing: 0)] 13 var body: some View { 14 NavigationView { 15 ScrollView() { 16 LazyVGrid(columns: columns, spacing: 5) { 17 ForEach(personGroups) { person in 18 ZStack{ 19 Image(URL(string: person.imgURL)) 20 .onTapGesture { 21 //タップするとフィルターが剥がれてしまう 22 if(person.tmpCount < 4){ 23 viewModel.updatePersonCount(person.id, newDetail: person.tmpCount + 1) 24 //updatePersonCountの実実行です。 25 //try! model.realm.write { 26 // item[keyPath: keyPath] = newValue 27 //} 28 //参考:https://software.small-desk.com/development/2022/02/25/swiftui-realm-todoapp-step4/ 29 }else{ 30 viewModel.updatePersonCount(person.id, newDetail: 0) 31 } 32 } 33 if(person.tmpCount > 0){ 34 Text(String(person.tmpCount)) 35 } 36 } 37 } 38 } 39 } 40 .onAppear { 41 //本題ではないため、内容に意味はないです。 42 let randomInt = Int.random(in: 1..<5) 43 if(randomInt == 1){ 44 arr.append("a") 45 }else if(randomInt == 2){ 46 arr.append("a") 47 arr.append("b") 48 }else{ 49 arr.append("a") 50 arr.append("b") 51 arr.append("c") 52 } 53 $itemGroups.filter = NSPredicate(format: "Alphabet IN %@",arr) 54 } 55 } 56 } 57 } 58 59

試したこと

・onAppearでフィルターをかけているが、initで実施しようとしてエラーが出たので断念
・onTapGestureの中でフィルターを再度かけるようにしたが、かからなかった。

補足情報(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

回答1

0

自己解決

ForEach(personGroups) { person in

let items = itemGroups.filter = NSPredicate(format: "Alphabet IN %@",arr)
ForEach(items) { person in

とすることでできました。

投稿2023/01/22 13:33

bakubaku

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問