2017-07-20 13 views
1

Firebaseデータベースの値を更新しようとしています。プッシュで作成されたノードを持つFirebaseデータベースの更新

enter image description here

私はr_ids_idが特定の値を持っている場合"accepted"statusの値を更新する必要があります。これは、データベースの構造です。ここでの問題は、各friend_data子供のための鍵は、この

db.child("friend_data").push().setValue(friend); 
私は this question here試してみました

this one hereのような「プッシュ」を使用して生成されますが、両方は私の要件を満たしていないということです。この問題を解決するにはどうしたらいいですか?

編集:ここでQueryを使用するはずです。これは私が試したものです:

final DatabaseReference db = FirebaseDatabase.getInstance().getReference("friend_data"); 

Query query = db.orderByChild("r_id").equalTo(f_id).orderByChild("s_id").equalTo(id); 
query.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     for (DataSnapshot child : dataSnapshot.getChildren()) { 
      db.child(child.getKey()).child("status").setValue("accepted"); 
     } 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 

    } 
}); 

これはどちらか

このエラーが発生したため、java.lang.IllegalArgumentExceptionが動作しません:あなたは、複数のORDERBYコールを組み合わせることはできません!

どのように2つのクエリを組み合わせるのですか?

答えて

1

私は最終的にこれを理解しようとした日の後に動作するようになった。

私は、サーバー側自身でデータの大きな塊をフィルタリングするためにorderByChild方法でクエリを追加しました(アイデアのために、このanswerのおかげで。)データ型DataSnapshotchildは、必要なすべてを持っていたように私が得た残りのデータを私が必要とした情報ここでは、クエリ

Query query = db.orderByChild("r_id").equalTo(f_id); 
query.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     for (DataSnapshot child : dataSnapshot.getChildren()) { 
      String child_s_id = (String) child.child("s_id").getValue(); 
      String child_status = (String) child.child("status").getValue(); 

      if (child_s_id.equals(id)) { 
       Log.e("Got value", f_id + " - x -" + id + " " + child_status); 

      } 
     } 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 

    } 
}); 

あるしかし、私は実際にchildの値のいずれかを変更する場合は、必要に応じて、私はchildの値を変更するsetValueのような任意の方法を使用することができなかったので、再び、私は、私の要件を満たすことができませんでした。

また、(データタイプがDataSnapShotの)childsetValueのリファレンスに変換しなければならないことがわかりました。そしてそれは働いた

child.getRef().child("status").setValue("accepted"); 

ここに完成したコードです。それが道に沿って誰かを助けることを望みます

Query query = db.orderByChild("r_id").equalTo(f_id); 
query.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     for (DataSnapshot child : dataSnapshot.getChildren()) { 
      String child_s_id = (String) child.child("s_id").getValue(); 
      String child_status = (String) child.child("status").getValue(); 

      if (child_s_id.equals(id)) 
       child.getRef().child("status").setValue("accepted"); 
     } 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 

    } 
}); 
関連する問題