[英]how to get data from firebase database
我是Firebase的新手。
我正在尝试分配有关用户在我的应用程序中注册的更多信息,因为名称,密码,电子邮件,图像不足以满足每个用户的需求。 因此,我决定将UID用作每个用户的密钥并将其存储在数据库中,以便稍后使用。 因此,如果用户在任何其他时间登录,我想检索此数据, 这些数据将不会再次更改,因此setvalue()并添加侦听器以进行更改不会与我一起工作,因此我对此进行了编码
Query q = FirebaseDatabase.getInstance().getReference().child("users").equalTo(FirebaseAuth.getInstance().getCurrentUser().getUid());
我下一步该怎么办?
该指南未说明有关equalto(),如何使用查询或如何在没有侦听器的情况下检索数据的任何信息
谢谢
Firebase检索查询是异步的,没有同步的“正式”方式(没有回调/侦听器)。
为什么它是异步的?
由于Firebase是基于云的,因此它需要进行网络调用以执行任何CRUD操作。
现在有了Query
对象,您只需附加一个ValueEventListener
并在DataSnapShot
接收数据。
注意: addListenerForSingleValueEvent(listener)
仅查询一次,与addValueEventListener(listener)
。
它看起来像这样:
q.addValueEventListener(
new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// for example: if you're expecting your user's data as an object of the "User" class.
User user = dataSnapshot.getValue(User.class);
}
@Override
public void onCancelled(DatabaseError databaseError) {
// read query is cancelled.
}
});
有关更多信息,请参考此链接
编辑:事件侦听器最初被触发一次,然后每当您查询的数据发生更改时便被触发。
您可以使用:
DatabaseReference usersRef = FirebaseDatabase.getInstance().getReference().child("users")
Query q= usersRef.orderByKey().equalTo(FirebaseAuth.getInstance().getCurrentUser().getUid());
然后将一个侦听器附加到您的查询以获取数据。
q.addValueEventListener(new ValueEventListener()){ }
否则,您可以通过以下方式构造数据:
users:
|-uid1 :
|-uid2 :
|-uid3 :
这样,您只需要使用以下代码来检索用户的DatabaseReference:
String uid= FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference userRef = FirebaseDatabase.getInstance().getReference().child("users").child(uid);
我发现Firebase事件侦听器需要花费一些时间来执行其任务,因此我只使用了标志和一些线程概念来实现与Firebase数据检索的最佳兼容性。
static long[] COUNTER_VAR;
static String STRING_VAR[];
final static int TOTAL_FLAGS = 10;
DATA_RECEIVED = new boolean[TOTAL_FLAGS];
COUNTER_VAR = new long[TOTAL_FLAGS];
STRING_VAR = new String[TOTAL_FLAGS];
INDEX_DATA_R = 0;
void increment`enter code here`_DataReceiveIndex(){
if(INDEX_DATA_R<TOTAL_FLAGS-1) {
INDEX_DATA_R += 1;
}else{
INDEX_DATA_R = 0;
}
}
public int getCount(final String path) {
final int cur = INDEX_DATA_R;
DATA_RECEIVED[cur] = false;
INDEX_DATA_R++;
mDatabaseReference.child(path).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
COUNTER_VAR[cur] = dataSnapshot.getChildrenCount();
DATA_RECEIVED[cur] = true;
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
return cur;
}
public boolean setIds() {
new Thread(new Runnable() {
@Override
public void run() {
int a = getCount(APPOINT_PATH);
while(!DATA_RECEIVED[a]) {
}
total_appointment = COUNTER_VAR[a];
mDatabaseReference.child("/ID/A").setValue(total_appointment);
}
}).start();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.