2017-11-10 4 views
0

私の活動の1つでは、Firebaseデータベースにデータを挿入します。別のアクティビティでは、挿入されたデータの子が存在するかどうかを確認する必要があります。キーが存在する場合、私はルートの一意のキーを取得したい。Android - データが存在する場合はキーを取得する(Firebase)

問題:

enter image description here

私はユーザ名子が存在するかどうかを確認したい: 私は、このデータベースの構造を有しています。もし存在すれば私はルートキーを取得したい。ルート一意キーとユーザー名ノードの両方が赤でマークされています。私は

//variable username is the actual username of the current user 
    userRef.child(sharedPreferences.getString("school", null)).child("routes").orderByChild("username").equalTo(username).addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot ds : dataSnapshot.getChildren()) { 
        String key=ds.getKey(); 
        System.out.println("key" + key); 
       } 
     } 

を行っている。しかし、私はドライバーのノード内で取得する方法を、今はなく、どのようにルートユニークなキーを取得するにはどう

。何か案は?

答えて

1

あなたがほとんどだ:あなたはroutesノードがあなたのFirebaseデータベースの直接の子であると仮定して、すべてのルートaccross usernameのexistentsを確認したい場合は

userRef.child("routes").child(routeId).child("drivers").child("username").addListenerForSingleValueEvent(new 
ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
      if(dataSnapshot.exists()){ 
       //do something 
      } 
    } 

は、次のコードを使用してくださいそこ。 orderByChild()へのパスを渡すと、そのパスのプロパティをフィルタリングできます。だから、:

userRef.child(sharedPreferences.getString("school", null)) 
     .child("routes").orderByChild("drivers/username").equalTo(username).addListenerForSingleValueEvent(new ValueEventListener() { 

は、今すぐあなたのonDataChangeは、必要なユーザ名を持っているすべてのノードのスナップショットと呼ばれます。したがって、それらをループして印刷することはあなたと同じです:

@Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     for (DataSnapshot ds : dataSnapshot.getChildren()) { 
      String key=ds.getKey(); 
      System.out.println("key" + key); 
     } 
    } 
+0

これは動作します、ありがとうございます。 – JDoe

1
if(ds.hasChild("drivers")){ 
      String key=ds.getKey();  
      } 

あなたはこれを行うことができます。

userRef.child("routes").orderByChild("username").equalTo("jju").addListenerForSingleValueEvent(...){ //code here } 

編集:

userRef.child("routes").addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     for (DataSnapshot ds : dataSnapshot.getChildren()) { 
       if(ds.hasChild("driver"){ 
       for(DataSnapshot data : ds.getChildren()){ 
        if(data.child("username").exists()){ 
       String key=ds.getKey(); 
       System.out.println("key" + key); 
        } 
       } 
       } 
      } 
    } 
+0

ありがとうございます。これは私に子供の 'ドライバー'のあるすべてのキーを与えます。子の 'username'が存在するかどうかを確認することは可能ですか? – JDoe

+0

あなたは上記@JDoe –

+0

を行うことができます何らかの理由でこれはキーを返しません。 – JDoe

1

はいすることができます、exists()方法を使用して。

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); 
DatabaseReference routesRef = rootRef.child("routes"); 
ValueEventListener eventListener = new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     for(DataSnapshot ds : dataSnapshot.getChildren()) { 
      if(ds.child("drivers").child("username").exists()) { 
       //do what you want 
      } 
     } 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) {} 
}; 
routesRef.addListenerForSingleValueEvent(eventListener); 
+0

私は経路IDを持っていません。それが問題だ。 – JDoe

+0

しかし、それを得ることができます。そのidを持つ最も簡単な方法は、次のようなpush()メソッドを使って生成した瞬間にそれを取得して保存することです: 'String routeId = yourRef.push()。getKey();'データベース参照でeaselyを使用してください。 –

+0

しかし、ユーザー名の子がその特定のrouteIdに存在しない場合は、別のrouteIdが存在します。私は多くのルートを持っているので、それぞれルートIDで識別されます。どのrouteIdが 'routeId'変数に格納されますか? – JDoe

関連する問題