2017-07-16 14 views
0

各ユーザー名の値からユーザーベースを検索したいと考えています。私がオンラインで見たことから、人々は多くの場合、のユーザーを返すが、それらをテーブルビューでフィルタリングするが、それは実用的でも実用的でもないようだ。私の考えは、データをクエリし、指数関数的に小さい値の配列を返すことでしたが、提供されたクエリメソッドを使用するのに問題があります。firebaseを効率的に照会する

データベースの特定の側面をクエリするにはどうすればよいですか。

実行可能になるようにコードを構成するには;一度に最大10のような何人かのユーザーに読み込まれません。

どのような提案、リソース、リンクをいただければ幸いです。

EDIT:

...これまでのところ、これは私が印刷に以下のコードでそれをテストしようとしてるものです私はいくつかの再探索を行なったし、Firebaseはメソッドを照会に建てられたいくつか付属していますように見えますユーザーがIで始まるが、私はそれがコンソール内の任意のユーザー

ref.queryOrderedByKey().queryStarting(atValue: "I").queryEnding(atValue: "I\u{f8ff}") 
     .observe(.childAdded, with: { snapshot in 
      print(snapshot.key) 
     }) 
+0

1)あなたの質問はTOOです。 2)あなたの試行を見せてください。 3)あなたの質問はすべてGoogleに簡単です。 gl –

+0

@VladPulichev私は少し質問を編集しました。あなたが素晴らしいものになるようなリソースを私に教えてもらえれば。 – Stefan

答えて

0

を印刷することができませんから、ユーザーのすべてのデータをロードするソリューションと、多くの場合、回数があまりにも多くのデータがあります。

ここでは、一般的なユーザーノード

users 
    uid_0 
    name: "Jean Luc" 
    uid_1 
    name: "Will" 
    uid_2 
    name: "Geordi" 

1つのオプションは、ユーザー名を取得するために、一度に各ユーザノード、1を反復処理することです。これにより、膨大なデータセット全体が回避されます。私たちは、第二の選択肢はかなりの残りの部分として、「混乱」を減らし、完全に別のノードにユーザー名を格納することで、アレイ

let usersRef = self.ref.child("users") 
    var userNamesArray = [String]() 

    usersRef.observe(.childAdded, with: { snapshot in 
     let userDict = snapshot.value as! [String: Any] 
     let name = userDict["name"] as! String 
     userNamesArray.append(name) 
    }) 

にそれぞれストアをロードするために.childAddedイベントを使用しますデータはメインユーザーノードに残ります

user_names 
    uid_0: "Jean Luc" 
    uid_1: "Will" 
    uid_2: "Geordi" 

この構造でわかるように、何千もの名前があるにもかかわらず、フットプリントが非常に小さいテキストです。

別のオプションは、.startingAtと.endingAtを使用してX個のユーザーを一度に読み込み、返されたユーザーを繰り返して各名前を取得することです。この場合、Aで始まりMで終わるすべてのユーザーが欲しいです...ごめんなさい。

let usersRef = self.ref.child("users") 
    var userNamesArray = [String]() 

    let nameQuery = usersRef.queryOrdered(byChild: "name") 
          .queryStarting(atValue: "A") 
          .queryEnding(atValue: "M\u{f8ff}") 
    nameQuery.observe(.value, with: { snapshot in 
     for child in snapshot.children { 
      let snap = child as! DataSnapshot 
      let userDict = snap.value as! [String: Any] 
      let name = userDict["name"] as! String 
      userNamesArray.append(name) 
     } 
    }) 

最後の例では、Aで始まるユーザ名で開始し、M + M

で始まるすべての名前のために、それは包括的になり、非常に高いUnicode文字、で終わるユーザー名で終わった\上のクエリで使用されているuf8ff文字は、Unicodeの範囲で非常に高いコードポイント です。 Unicodeでは最も一般的な文字の後にあるため、queryはqueryStringで始まるすべての値と一致します。

関連する問題