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

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

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

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

Swift

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

Q&A

解決済

1回答

2829閲覧

realmのデータ取得、filterメソッドについて

Daisuke0315

総合スコア23

Realm

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

Swift

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

0グッド

0クリップ

投稿2020/05/02 00:27

編集2020/05/03 01:59

【やりたいこと】
文字列でプロパティ名を指定してフィルタリングしたい

【出来たこと】
以下の変数を用いたid検索は実現することは出来ました

swift

1 let realm = try! Realm() 2try! realm.write { 3let 検索結果 = realm.objects(todo.self).filter("id == '(self.realmID[indexPath.row - 1])'") 4 5省略 6}

【わからないこと】
変数を用いずにフィルタをかけると以下のエラーが出ました。
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse the format string "id == '任意'"'

swift

1 2 let filterRealm = realm.objects(todo.self).sorted(by: sortProperties).filter("id == '任意'") 3

しかし、NSPredicateクラスを使用したクエリを用いた場合は意図通りに動きました。

swift

1 let sortRealm = realm.objects(todo.self).sorted(by: sortProperties).filter("%K == %d", "id", "任意")

【教えていただきたいこと】
文字列によるクエリを用いたフィルタリング操作方法を教えていただきたいです。
以下のhpを参考にしました。
https://swift.hiros-dot.net/?p=632#toc15

【クラスの定義】

swift

1import Foundation 2import RealmSwift 3 4class todo: Object { 5 @objc dynamic var id:String = "" 6)

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

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

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

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

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

guest

回答1

0

ベストアンサー

todo クラスの定義がわからないので推測になりますが、、、 以下のように idフィールドが Int型 になっていないのでしょうか?

class todo: Object { @objc dynamic var id: Int = 0 }

もし idフィールド が Int型であれば、以下のように書けばうまくいくかと思います。

let filterRealm = realm.objects(todo.self).sorted(by: sortProperties).filter("id == 393")

String型のフィールドを検索するのであれば、以下のように書きます。

let filterRealm = realm.objects(todo.self).sorted(by: sortProperties).filter("id == '393'")

Realmの質問はどのようなオブジェクトを定義して扱っているのかがわからないと回答が難しいケースが多々ありますので、質問に todoクラスの定義も合わせて書いていただくとスムーズに回答がつくかと思います。

追記1

todoクラスの定義をありがとうございます。早速試してみました。

let realm = try! Realm() try! realm.write { let item = todo() item.id = "393" realm.add(item) } // 変数を使ってtodoを取得する let id = "393" let todoItem1 = realm.objects(todo.self).filter("id == '(id)'").first // todoのidを文字列で指定する let todoItem2 = realm.objects(todo.self).filter("id == '393'").first // ソートしてからfilterを使う let sortProperties = [ SortDescriptor(keyPath: "id", ascending: true) ] let todoItem3 = realm.objects(todo.self).sorted(by: sortProperties).filter("id == '393'").first

いずれのケースでも問題なく Realmからオブジェクトの取得ができました。

投稿2020/05/02 08:37

編集2020/05/03 03:07
ch3cooh

総合スコア287

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

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

Daisuke0315

2020/05/03 01:58

お返事ありがとうございます。 情報が足りず申し訳有りません。 質問を編集しておきます。 教えていただいたように入力したのですが同様のエラーが出てしまいます。 let filterRealm = realm.objects(todo.self).sorted(by: sortProperties).filter("id == '393'") NSPredicateクラスを使用したクエリでは動いてはいるのですが気になります。
Daisuke0315

2020/05/03 03:12

迅速な回答ありがとうございます、もう一度いちから見直してみます。 今後とも宜しくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問