132

特定のユーザーアカウントでデータを取得/設定できるアプリケーションを作成しようとしていますが、Firebaseに誘惑されました。

私が抱えている問題は、私の構造が次のようになっているときに、特定のユーザーデータをターゲットにする方法がわからないことです。

以下のテキストで説明されている私のデータ構造。

online-b-cards
  - users
    - InnROTBVv6FznK81k3m
       - email: "hello@hello"
       - main:  "Hello world this is a text"
       - name:  "Alex"
       - phone: 12912912

私は周りを見回しましたが、IDとしてランダムなハッシュが与えられている場合はもちろん、個々のデータにアクセスする方法については何も見つかりません。

名前に基づいて個々のユーザー情報を取得するにはどうすればよいですか?これを行うためのより良い方法があれば教えてください!

4

8 に答える 8

158

以前の Firebase では、独自のインデックスを生成する、場所にあるすべてのデータをダウンロードして、子属性 (たとえば、 を持つすべてのユーザーname === "Alex") に一致する要素を見つけて取得する必要がありました。

2014 年 10 月、Firebase はorderByChild()メソッドを介して新しいクエリ機能を展開しました。これにより、このタイプのクエリを迅速かつ効率的に実行できます。以下の更新された回答を参照してください。


Firebase にデータを書き込む場合、さまざまなユース ケースを反映するいくつかの異なるオプションがあります。大まかに言うと、Firebase はツリー構造の NoSQL データ ストアであり、データのリストを管理するためのいくつかの単純なプリミティブを提供します。

  1. 一意の既知のキーを使用して Firebase に書き込みます。

    ref.child('users').child('123').set({ "first_name": "rob", "age": 28 })
    
  2. 書き込まれた時間で自動的にソートされる自動生成されたキーでリストに追加します。

    ref.child('users').push({ "first_name": "rob", "age": 28 })
    
  3. 一意の既知のパスでデータの変更をリッスンします。

    ref.child('users').child('123').on('value', function(snapshot) { ... })
    
  4. リスト内のデータをキーまたは属性値でフィルタリングまたは順序付けします。

    // Get the last 10 users, ordered by key
    ref.child('users').orderByKey().limitToLast(10).on('child_added', ...)
    
    // Get all users whose age is >= 25
    ref.child('users').orderByChild('age').startAt(25).on('child_added', ...)
    

が追加されたことでorderByChild()、子アトリビュートに対するクエリ用に独自のインデックスを作成する必要がなくなりました。たとえば、「Alex」という名前のすべてのユーザーを取得するには、次のようにします。

ref.child('users').orderByChild('name').equalTo('Alex').on('child_added',  ...)

こちらの Firebase のエンジニア。Firebase にデータを書き込む場合、さまざまなアプリケーションのユースケースを反映するいくつかの異なるオプションがあります。Firebase は NoSQL データ ストアであるため、そのアイテムに直接アクセスできるように一意のキーを使用してデータ オブジェクトを格納するか、特定の場所にあるすべてのデータを読み込んで各アイテムをループ処理し、探しているノードを見つける必要があります。 . 詳細については、データの書き込みリストの管理を参照してください。

Firebase にデータを書き込むときはset、一意の定義済みパスを使用してデータを書き込むa/b/cpush(つまりa/b/<unique-id>. 上に表示されている一意の ID は、 を呼び出しpushてリストに項目を追加することによって生成されますonline-b-cards/users

ここで使用するのではなく、 を使用し、ユーザーの電子メール アドレスなどの一意のキーを使用して各ユーザーのデータを保存するpushことをお勧めします。次に、Firebase JS SDK 経由で にset移動して、ユーザーのデータに直接アクセスできます。online-b-cards/users/<email>例えば:

function escapeEmailAddress(email) {
  if (!email) return false

  // Replace '.' (not allowed in a Firebase key) with ',' (not allowed in an email address)
  email = email.toLowerCase();
  email = email.replace(/\./g, ',');
  return email;
}

var usersRef = new Firebase('https://online-b-cards.firebaseio.com/users');
var myUser = usersRef.child(escapeEmailAddress('hello@hello.com')) 
myUser.set({ email: 'hello@hello.com', name: 'Alex', phone: 12912912 });

Firebase では参照に特定の文字を使用できないため (「参照の作成」を参照)、上記のコードで を削除.して a に置き換えます。,

于 2013-02-19T18:47:01.363 に答える
6

次のコードで詳細を取得できます。

FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference("users");
myRef.orderByChild("name").equalTo("Alex").addListenerForSingleValueEvent(new ValueEventListener() {           
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

                    for (DataSnapshot childDataSnapshot : dataSnapshot.getChildren()) {
                        Log.d(TAG, "PARENT: "+ childDataSnapshot.getKey());
                        Log.d(TAG,""+ childDataSnapshot.child("name").getValue()); 
                    }
于 2017-01-09T13:17:40.357 に答える
2

これは、自動生成された一意の ID にアクセスしようとしたときに役立つ投稿の言い換えでした。angularFireの暗黙的な同期を使用して、ng-repeat内のFirebaseの一意のIDにアクセスします

ありがとう、ベンリッヒ(ソース):

Firebase は通常の JavaScript オブジェクトのように動作します。おそらく、以下の例で正しい軌道に乗ることができます。

<div ng-repeat="(name, user) in users">
    <a href="" ng-href="#/{{name}}">{{user.main}}</a>
</div>

編集: 希望する結果が 100% 確実というわけではありませんが、「あはは」の瞬間を引き起こす可能性があるもう少しのものがあります。Firebase ダッシュボードでアクセスしようとしているキーをクリックします。そこから、次のようなものを使用できます。

var ref = new Firebase("https://online-b-cards.firebaseio.com/users/<userId>/name);
    ref.once('value', function(snapshot) {
        $scope.variable= snapshot.val();
});
于 2015-02-27T08:01:11.757 に答える