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


129

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

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

以下のテキストで説明する私のデータ構造。

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

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

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


回答:


156

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

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

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では参照に特定の文字を使用できないため(「参照の作成」を参照)、上記のコードでを削除して.に置き換えていることに注意してください,


1
@RobDiMarcoスティーブンが以下に投稿した質問に対する回答はありますか?
Charles Han

2
@RobDiMarcoさん、こんにちは。メールアドレスをIDのベースとして使用するという提案は引き続き有効ですが、新しいorderByChild機能を指すように回答を拡張することは価値があるかもしれません。この回答が関連/関連する回答としてかなり頻繁に表示されることを考えると、人々はそれを見なければならず、新しいクエリ機能に注意する必要があります。
フランクファンPuffelen 2014年

1
@FrankvanPuffelen素晴らしいアイデア-メモをありがとう。今日更新します。
Rob DiMarco 2014年

1
@Ced残念ながら、私は作品の内容についてコメントすることはできません。私たちは一生懸命働いていることを約束します(それは常に真実でした)が、具体的なことは言えません。データベースAPIは確かにいくつかの点で制限があります。これを意図的に行うのは、特定のレベルのパフォーマンスを保証できるメソッドのみを公開するためです。これが、たとえばリスト全体に対して操作を実行するメソッドを公開しない理由です。上級ユーザー向けドキュメントの公平なポイント。疑問がある場合は、Googleグループで詳細な会話を試してください:groups.google.com/forum / # ! forum / firebase-talkチームはここで非常に活発です!
Rob DiMarco 2017

1
@RobDiMarcoそれは聞いて素晴らしいです。昨日Firebaseの機能を見て、Firebaseはゲームチェンジャーであり、バックエンドに革命を起こそうとしていると思っていたので、一日中大騒ぎになりました。真剣に、私はFirebaseのバックエンドを維持するように彼の人生でコーディングしたことがない人に教えることができます。それは驚くべきことであり、非常に恐ろしいことです。乾杯
CED

5

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

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

4

最善の方法は、Firebaseによって提供される認証オブジェクトに基づいてユーザーの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');

2

これは、自動生成された一意の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%確実ではありませんが、「あは」の瞬間を引き起こすかもしれないもう少しここにあります。Firebaseダッシュボードで、アクセスしようとしているキーをクリックします。そこから次のようなものを使用できます:

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

こんにちはアンソニー、REST構造(?)を守る情報をありがとう、そしてそれは間違いなく 'aha'を襲った。この投稿を振り返ると、データが少し厄介な方法で構造化されていることがわかりました。ヒントに感謝します。次回のFirebaseベースのプロジェクトでそれを覚えておきます!
Richard Bamford 2016年

2

これは、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);
});

1

最も簡単な方法は、 .push(){}

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


1

データの取得:

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

Androidアプリで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アプリで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"ようなものです。


最良の方法:

最善の方法は、Firebase Authenticationを使用して、ユーザーごとに一意のIDを生成し、ランダムIDの代わりに使用することpush()です。これにより、IDがあり、簡単にアクセスできるため、すべてのユーザーをループする必要がありません。

最初に、ユーザーはサインインする必要があります。次に、一意の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;
   });
 

0

認証されたユーザーに応じて一意の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になります


3
それは問題を解決しません。問題は、特定のユーザーアカウントでデータを取得および設定する方法でした。コードはユーザーアカウントを作成しますが、userは有効なパラメーターではないため、.setValue(user)を実行できないため、実際には無効です。
ジェイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.