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

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

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

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

iOS

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

Swift

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

Q&A

解決済

1回答

1168閲覧

FirebaseのqueryOrderedがうまくいかない

masamasamasa

総合スコア95

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

iOS

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

Swift

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

0グッド

0クリップ

投稿2019/06/04 03:10

編集2019/06/05 08:17

やりたいこと

ノードa-b-cのb-1に属するcを取ってきて、ノードcから値を取ってきたい

具体的には、bー1に属するc-1, c-3を取って、ノードcからcー1, c-3の値を取ってくる
イメージ説明

やったこと

Swift

1// ノードcから値を取ってくる 2let REF_C = Database.database().reference().child("c") 3func queryCfromABC(a: String, b: String, text: String, completion: @escaping (Class) -> Void) { 4 referenceABC(a: a, b: b) { (c) in 5 self.REF_C.child(c).queryOrdered(byChild: "name").queryStarting(atValue: text).queryEnding(atValue: text+"\u{f8ff}").observeSingleEvent(of: .value, with: { (DataSnapshot) in 6 DataSnapshot.children.forEach({ (child) in 7 let child = child as! DataSnapshot 8 if let dict = child.value as? [String: Any] { 9 let newC = Class.transformClass(dict: dict, key: child.key) 10 completion(newC) 11 } 12 }) 13 }) 14 } 15} 16// ノードabcからaとbを指定して、b-1に属するcを取ってくる 17let REF_ABC = Database.database().reference().child("a-b-c") 18func referenceABC(a: String, b: String, completion: @escaping (String) -> Void) { 19 REF_ABC.child(a).child(b).observeSingleEvent(of: .value, with: { (DataSnapshot) in 20 DataSnapshot.children.forEach({ (c) in 21 let child = c as! DataSnapshot 22 completion(child.key) 23 }) 24 }) 25}

問題点

ノードに参照してqueryOrderedはできるが、
ノードに参照して、取ってきた値を指定して、queryOrderedができない。

Swift

1// これはできる 2let REF_C = Database.database().reference().child("c") 3self.REF_C.queryOrdered(byChild: "name")

Swift

1// これができない 2let REF_C = Database.database().reference().child("c") 3self.REF_C.child(c).queryOrdered(byChild: "name")

どうすればよいでしょうか?
すみませんが、よろしくお願いいたします。

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

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

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

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

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

akaakoz

2019/06/04 06:39

child(c)はちゃんと"c-1", "c-2", "c-3"の値を参照してますか?
masamasamasa

2019/06/04 12:10

ご返事ありがとうございます。 child(c)は、completion(child.key)が返ってくるので、"c-1"と"c-3"が一つずつ返ってきます。
akaakoz

2019/06/05 07:20

参照したreferenceを以下のchildAddedでオブザーブするとどうなりますか? let REF_C = Database.database().reference().child("c") self.REF_C.child(c).queryOrdered(byChild: "name").observe(.childAdded)
masamasamasa

2019/06/05 07:22

ご返信ありがとうございます。 今やってみます!
masamasamasa

2019/06/05 07:50 編集

self.REF_CLASSES.child(c).queryOrdered(byChild: "name").observe(.childAdded, with: { (DataSnapshot) in print("DataSnapshot.value -> \(DataSnapshot.value!)") DataSnapshot.value -> description DataSnapshot.value -> name DataSnapshot.value -> description DataSnapshot.value -> name
masamasamasa

2019/06/05 07:41

queryOrdered(byChild: "name" にかかわらず、値が返ってきました
akaakoz

2019/06/05 08:10 編集

nameの値のみを読み取りたいって事ですかね? queryOrderedは指定した子キーまたはネストされた子のパスの値によって結果を並べ替え時に使うので、descriptionの値も一緒に読み取ります。ただnameの値によって並び替えになります。 あと分かりやすくするためにkey: valueを違う値で示した方がいいと思います 例 ) name: "hoge" description: "fuga"
masamasamasa

2019/06/05 08:19 編集

ありがとうございます。 c-1とc-3の値を全部取ってきたいです。 self.REF_C.child(c).queryOrdered(byChild: "name").queryStarting(atValue: text).queryEnding(atValue: text+"\u{f8ff}").observeSingleEvent(of: .value, with: { (DataSnapshot) in DataSnapshot.children.forEach({ (child) in       print("child -> \(child)")
masamasamasa

2019/06/05 08:21

上のコードで、 print("child -> \(child)") child -> Snap (c-1) { description = fuga; name = hoge; } child -> Snap (c-3) { description = fuga; name = hoge; }
masamasamasa

2019/06/05 08:21

となるように取ってきたいです。
masamasamasa

2019/06/05 08:27 編集

REF_C.queryOrdered(byChild: "name") だと機能するのですが、 REF_C.child(c).queryOrdered(byChild: "name") で、child(c)を入れると機能しなくなります。
masamasamasa

2019/06/05 08:28

child(c)で1コ指定したら、queryOrderedは使えなくなるのでしょうか?
akaakoz

2019/06/05 08:46

REF_C.child(c).queryOrdered(byChild: "name")でのprint("child -> \(child)") はどのような値が返ってきますか? 機能しなくなるというのは何の値を取得出来ないという事ですかね?
akaakoz

2019/06/05 08:51

self.REF_C.child(c).queryOrdered(byChild: "name").queryStarting(atValue: text).queryEnding(atValue: text+"\u{f8ff}").observeSingleEvent(of: .value, with: { (DataSnapshot) in print(DataSnapshot) をするとどうなりますか?
masamasamasa

2019/06/05 08:54

DataSnapshot -> Snap (c-1) <null> DataSnapshot -> Snap (c-3) <null>
masamasamasa

2019/06/05 08:54

が出ます。 print("child -> \(child)") はなにもでませんでした
guest

回答1

0

自己解決

すいません。
もう一回書き直して、自分でやり直してみたいと思います。

投稿2019/06/05 12:35

masamasamasa

総合スコア95

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問