2013-02-19 32 views
108

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

私がいる問題は、私の構造はこのようになりますときに私は特定のユーザーデータをターゲットにする方法がわからないということです:私は周りを見回していると私はできる

My data structure described by the text below.

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

ランダムなハッシュをIDとして与えられたときだけでなく、個々のデータにアクセスする方法については、実際には何も見つかりません。

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

+0

これを試してください:http://stackoverflow.com/questions/32886546/how-to-get-all-child-list-from-firebase-android/36600791#36600791 –

答えて

133

以前は、Firebaseは独自のインデックスかの場所ですべてのデータを検索し、いくつかの子属性にマッチした要素を取得するためにダウンロード(たとえば、name === "Alex"を持つすべてのユーザー)を生成するためにあなたを必要としました。

Firebaseは2014年10月に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. そのユニークな、知られているパスによってデータの変更のためのを聞く:

    // 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', ...) 
    
    キーまたは属性値によって、リスト内のデータ

    ref.child('users').child('123').on('value', function(snapshot) { ... }) 
    
  4. フィルター

t orderByChild()が追加されたため、子属性のクエリ用に独自のインデックスを作成する必要はなくなりました。ここFirebaseで

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

エンジニア:たとえば、名前を持つすべてのユーザー "アレックス" を取得します。 Firebaseにデータを書き込む際には、アプリケーションのさまざまな使用事例を反映するためのオプションがいくつかあります。FirebaseはNoSQLデータストアなので、データオブジェクトに固有のキーを格納して、そのアイテムに直接アクセスできるようにするか、特定の場所にすべてのデータをロードし、各アイテムをループして、探しているノードを見つけ出す必要がありますために。詳細については、Writing DataおよびManaging Listsを参照してください。

あなたはFirebaseにデータを書き込むときは、することができますいずれかの一意のIDを(つまりa/b/<unique-id>)を生成し、ソートすることができますユニークな、定義されたパス(すなわちa/b/c)、またはリストにpushデータを、使用してsetデータとそのリスト内の項目を時間で照会します。上に表示されている一意のIDは、pushを呼び出して、リストに項目を追加することによって生成されます(online-b-cards/users)。

ここでpushを使用するのではなく、setを使用し、各ユーザーのデータをユーザーの電子メールアドレスなどの一意のキーを使用して保存することをお勧めします。 Firebase JS SDKを使用してonline-b-cards/users/<email>に移動して、直接ユーザーのデータにアクセスできます。たとえば、次のFirebaseは、参照(Creating Referencesを参照)で特定の文字を許可していないので、我々は.を削除し、上記のコードで,に置き換えること

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

注意。

+2

パーフェクト!レスポンスRobに感謝します。愛するfirebase! –

+0

私が得ないのは、あなたがプロパティとしてIDを持つオブジェクトを取得したときにクエリuを実行するときです。この場合、エスケープされた電子メールでは、値は設定したオブジェクトです。もちろんあなたのリストを読んでいれば、IDを知ることはできません。どうすればデータを読むはずですか? – Sam

+0

@Sam私はあなたの質問を完全には理解していませんが、いくつかのサンプルコードで別の質問をし、ユースケースを説明してもらえれば喜んで助けてください。 –

2

これは、自動生成された一意のIDにアクセスしようとするときに役立つ投稿の言い換えです。 Access Firebase unique ids within ng-repeat using angularFire implicit sync

おかげで、bennlich(ソース):

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

こんにちはアンソニー、REST構造(?)を尊重してくれてありがとう、それは間違いなくstrickに 'aha'でした。この記事を振り返ってみると、ちょっとしたやり方でデータを構造化したので、ヒントのおかげで、私の次のfirebaseベースのプロジェクトのために念頭に置いておくことにしました。 –

4

を私は最善のアプローチはFirebaseが提供する認証オブジェクトO系のユーザーのIDを定義することであると思います。私は私のユーザーを作成すると、私はない:このIDはから来て

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

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認証サービスは、常にUIDに設定されるすべてのプロバイダの間で一意のIDを保証します。この方法では、常にあなたはauth.uidを持つことになり、簡単のように、それを更新したいユーザーにアクセスすることができます:あなたは、次のコードで詳細をつかむことができ

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

データ構造

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

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

ウルに固有のIDを追加する最も簡単なとより良い方法認証されたユーザに応じたデータベースはこれです:

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)できません。 – Jay

0

を認証される最も簡単な方法は、ランダムキーを生成します.push(){}

機能を使用して停止することです。しかし、代わりに.update(){}関数を使用して、ランダムキーを持つ代わりに子供の名前を指定することができます。

関連する問題