web-dev-qa-db-ja.com

Firebaseを使用して名前プロパティでユーザーを取得する

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

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

My data structure described by the text below.

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

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

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

126
Richard Bamford

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

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


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

  1. 固有の既知のキーでFirebaseに書き込みます

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

    ref.child('users').Push({ "first_name": "rob", "age": 28 })
    
  3. Listen一意の既知のパスによるデータの変更を確認します。

    ref.child('users').child('123').on('value', function(snapshot) { ... })
    
  4. Filterまたはorderリスト内のデータをkeyまたはattribute value

    // 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/c)、またはPushデータをリストに入れて、一意のIDを生成できます(つまりa/b/<unique-id>)を使用して、そのリスト内のアイテムを時間で並べ替えてクエリできるようにします。上記の一意のIDは、Pushを呼び出してonline-b-cards/usersのリストにアイテムを追加することにより生成されます。

ここでPushを使用するのではなく、setを使用し、ユーザーのメールアドレスなどの一意のキーを使用して各ユーザーのデータを保存することをお勧めします。次に、Firebase JS SDKを介して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('[email protected]')) 
myUser.set({ email: '[email protected]', name: 'Alex', phone: 12912912 });

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

155
Rob DiMarco

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

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()); 
                    }
5
Nabajyoti Das

Firebaseが提供するauthオブジェクトに基づいてユーザーのIDを定義するのが最善のアプローチだと思います。ユーザーを作成するとき、次のことを行います。

FirebaseRef.child('users').child(id).set(userData);

このIDは次のものから取得されます。

var ref = new Firebase(FIREBASE);
var auth = $firebaseAuth(ref);
auth.$authWithOAuthPopup("facebook", {scope: permissions}).then(function(authData) {
    var userData = {}; //something that also comes from authData
    Auth.register(authData.uid, userData);
}, function(error) {
    alert(error);
});

Firebase認証サービスは、常にすべてのプロバイダーの中で一意のIDがuidに設定されるようにします。これにより、常にauth.uidが得られ、次のように目的のユーザーに簡単にアクセスして更新できます。

FirebaseRef.child('users').child(id).child('name').set('Jon Snow');
4
diegopso

これは、Firebaseで自動生成された一意のキーにアクセスする方法です。データ構造:-OnlineBcards-UniqueKey

database.ref().on("value", function(snapshot) {
      // storing the snapshot.val() in a variable for convenience
      var sv = snapshot.val();
      console.log("sv " + sv); //returns [obj obj]

      // Getting an array of each key in the snapshot object
      var svArr = Object.keys(sv);
      console.log("svArr " + svArr); // [key1, key2, ..., keyn]
      // Console.log name of first key
      console.log(svArr[0].name);
}, function(errorObject) {
  console.log("Errors handled: " + errorObject.code);
});
2
Juan Reyes

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

ありがとう、benlich(ソース):

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

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

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

var ref = new Firebase("https://online-b-cards.firebaseio.com/users/<userId>/name);
    ref.once('value', function(snapshot) {
        $scope.variable= snapshot.val();
});
2
AnthonyC

最も簡単な方法は、.Push(){}の使用を停止することです

そのランダムキーを生成する関数。ただし、代わりに.update(){}関数を使用して、ランダムキーを持たせる代わりに子の名前を指定できます。

1
Miah Thompson

データの取得:

データベースでは、Push()を使用して生成されたランダムIDを使用しているため、データを取得する場合は以下を実行します。

Android AppでFirebaseを使用する:

DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("users");
ref.addListenerForSingleValueEvent(new ValueEventListener() {           
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                for (DataSnapshot datas : dataSnapshot.getChildren()) {
                    String name=datas.child("name").getValue().toString();
                }
             }

            @Override
           public void onCancelled(DatabaseError databaseError) {
          }
     });

JavascriptでFirebaseを使用する:

  firebase.database().ref().child("users").on('value', function (snapshot) {
   snapshot.forEach(function(childSnapshot) {
    var name=childSnapshot.val().name;
  });
});

ここで、usersにスナップショット(データの場所)があります。次に、すべてのランダムID内でループし、名前を取得します。


特定のユーザーのデータを取得する:

特定のユーザーのみの情報を取得する場合は、クエリを追加する必要があります。

Android AppでFirebaseを使用する:

DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("users");
Query queries=ref.orderByChild("name").equalTo("Alex");
queries.addListenerForSingleValueEvent(new ValueEventListener() {...}

JavaScriptでFirebaseを使用する

firebase.database().ref().child("users").orderByChild("name").equalTo("Alex").on('value', function (snapshot) {
   snapshot.forEach(function(childSnapshot) {
      var name=childSnapshot.val().name;
   });
});

orderByChild("name").equalTo("Alex")を使用することはwhere name="Alex"を言うことに似ているため、Alexに関連するデータを取得します。


最良の方法:

最善の方法は、Firebase認証を使用することです。したがって、各ユーザーに一意のIDを生成し、ランダムID Push()の代わりに使用します。簡単にアクセスできます。

まず、ユーザーがサインインする必要があります。次に、一意のIDを取得し、リスナーをアタッチしてそのユーザーの他のデータを取得できます。

AndroidでFirebaseを使用する:

DatabaseReference ref = FirebaseDatabase.getInstance().getReference("users");
String uid = FirebaseAuthentication.getInstance().getCurrentUser().getUid();

ref.child(uid).addListenerForSingleValueEvent(new ValueEventListener() {
          @Override
         public void onDataChange(DataSnapshot dataSnapshot) { 
           String name=dataSnapshot.child("name").getValue().toString(); 
   }
         @Override
       public void onCancelled(DatabaseError databaseError) {
      }
 });

JavaScriptでFirebaseを使用する:

    var user = firebase.auth().currentUser;
    var uid=user.uid;

    firebase.database().ref().child("users").child(uid).on('value', function (snapshot) {
     var name=snapshot.val().name;
   });
1
Peter Haddad

認証されたユーザーに応じて一意のIDをurデータベースに追加する最も簡単で優れた方法は次のとおりです。

private FirebaseAuth auth;

String UId=auth.getCurrentUser().getUid();

FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference("Users");

User user = new User(name,email,phone,address,dob,bloodgroup);

myRef.child(UId).setValue(user);

UIdは、特定の認証済みメール/ユーザーの一意のIDです

0
M.Usman Younas