私はbloodgroupなど、名前、住所のように自分の情報を表示したいユーザーでログインに基づいて私のデータベース構造は、以下のようなものです。
ドナー:
O+:
einsein:
name: einstein
email: [email protected]
bloodgroup: O+
age: 20
address: 11/237
A-:
thamizh:
name: thamizh
email: [email protected]
bloodgroup: A-
age: 21
address: 11/23.
public class userinfo extends AppCompatActivity {
TextView t1,t2,t3,t4,t5;
DatabaseReference oref;
FirebaseAuth auth;
FirebaseUser user;
String uid,email;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_userinfo);
auth = FirebaseAuth.getInstance();
user = auth.getCurrentUser();
uid = user.getUid();
email = user.getEmail();
t1 = (TextView) findViewById(R.id.l11);
t2 = (TextView) findViewById(R.id.l22);
t3 = (TextView) findViewById(R.id.l33);
t4 = (TextView) findViewById(R.id.l44);
t5 = (TextView) findViewById(R.id.l55);
oref = FirebaseDatabase.getInstance().getReference().child("Donor");
oref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String name = dataSnapshot.child("donorID").getValue().toString();
String bldgrp = dataSnapshot.child("bloodgroup").getValue().toString();
String mob = dataSnapshot.child("mobile").getValue().toString();
String eid = dataSnapshot.child("email").getValue().toString();
String add = dataSnapshot.child("address").getValue().toString();
t1.setText(name);
t2.setText(bldgrp);
t3.setText(mob);
t4.setText(eid);
t5.setText(add);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}
今、あなたのコードは、データベースからすべてのユーザーをロードし、その後、それらのユーザーからの1のプロパティを読み取ろうとしている/Donor
ノード。それは動作しません。
非常に少なくとも、あなたはあなたのユーザーをループする必要がありますonDataChange
:
oref = FirebaseDatabase.getInstance().getReference().child("Donor");
oref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshots) {
for (DataSnapshot dataSnapshot: snapshots.getChildren()) {
String name = dataSnapshot.child("donorID").getValue().toString();
String bldgrp = dataSnapshot.child("bloodgroup").getValue().toString();
String mob = dataSnapshot.child("mobile").getValue().toString();
String eid = dataSnapshot.child("email").getValue().toString();
String add = dataSnapshot.child("address").getValue().toString();
t1.setText(name);
t2.setText(bldgrp);
t3.setText(mob);
t4.setText(eid);
t5.setText(add);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException(); // never ignore errors
}
});
上記のコードはまだからすべての子ノードを取得します/Donor
が、今はそれらを介してループし、テキストビューでプロパティを設定します。あなたが唯一のユーザのためのテキストビューを持っているので、あなたは、以前の値たびに上書きされます。だから、最後に、あなたはJSONからの最後のユーザーのプロパティを持っています。それはあなたが望むものではないが、少なくともそれは、より良いあなたが現在持っているものよりもです。
次はあなたが表示することを単一のユーザーのためのデータだけをロードしています。これは、あなたがその単一のユーザーを識別できることが必要です。
これを行うための最も一般的な方法は、そのユーザのUIDの下で、データベースにデータを格納することです。そう:
Users: {
"uidOfUser1": { ... },
"uidOfUser2": { ... },
"uidOfUser3": { ... }
}
このタイプの構造を使用すると、現在と、ユーザーに署名のためのデータへの参照を取得することができます:
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
oref = FirebaseDatabase.getInstance().getReference()
.child("Donor")
.child(uid);
あなたはこのリファレンスにリスナーを追加した場合、あなたが唯一のユーザのためにデータをロードしているので、あなたは、私たちが追加したループを削除することができます。
葉その質問:あなたは自分のUIDの下で、ユーザ情報を格納していなかった場合はどうしますか?その場合は、私が最初のUIDの下でユーザデータを記憶するものとして、データの再構築を検討をお勧めしたいことは、迅速かつ簡単に検索取得するための慣用的な方法です。
しかし、時にはあなたは本当に再構築、及びその場合には、あなたは、ユーザーのためのノード(複数可)を見つけるために、データベースクエリを実行することができます。クエリを使用できるようにするには、ユーザーの1(好ましくは一意の)プロパティの値を知っている必要があります。
あなたは自分のメールアドレスを知っていると言います。その後、そのメールアドレスを持つためのノード(複数可)を取得することができます:
FirebaseDatabase.getInstance().getReference()
.child("Donor")
.orderByChild("email").equalTo("[email protected]");
このクエリにリスナーを添付するとき、あなたは我々が上記追加したforループと同じに必要なので、再度、複数の結果を得ることができます。