Java 如何从firebase数据库获取数据
我是firebase的新手 我正在尝试分配更多关于在我的应用程序中注册的用户的信息,因为姓名、密码、电子邮件和图像对于每个用户都是不够的。所以我决定使用UID作为每个用户的密钥,并将其存储在数据库中,以便稍后获取。 因此,如果用户在任何其他时间登录,我想检索这些数据,这些数据将不会再次更改,因此setvalue和add listener to change将不会与我一起工作,因此,为了执行此操作,我编写了代码Java 如何从firebase数据库获取数据,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我是firebase的新手 我正在尝试分配更多关于在我的应用程序中注册的用户的信息,因为姓名、密码、电子邮件和图像对于每个用户都是不够的。所以我决定使用UID作为每个用户的密钥,并将其存储在数据库中,以便稍后获取。 因此,如果用户在任何其他时间登录,我想检索这些数据,这些数据将不会再次更改,因此setvalue和add listener to change将不会与我一起工作,因此,为了执行此操作,我编写了代码 Query q = FirebaseDatabase.getInstance().ge
Query q = FirebaseDatabase.getInstance().getReference().child("users").equalTo(FirebaseAuth.getInstance().getCurrentUser().getUid());
下一步我该怎么办
该指南没有说明有关equalto、如何使用查询或如何在没有侦听器的情况下检索数据的任何信息
感谢Firebase检索查询是异步的,没有回调/侦听器,就没有正式的同步方式 为什么它是异步的 因为Firebase是基于云的,所以它需要进行网络调用来执行任何CRUD操作 现在您有了查询对象,只需附加ValueEventListener并在DataSnapShot中接收数据 注意:addListenerForSingleValueEventlistener只查询一次,与AddValueEventListener相反 它看起来是这样的:
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.
}
});
有关更多信息,请参阅此
编辑:事件监听器最初触发一次,然后在您查询的数据发生更改时触发。Firebase检索查询是异步的,没有回调/监听器,就没有同步的正式方法 为什么它是异步的 因为Firebase是基于云的,所以它需要进行网络调用来执行任何CRUD操作 现在您有了查询对象,只需附加ValueEventListener并在DataSnapShot中接收数据 注意:addListenerForSingleValueEventlistener只查询一次,与AddValueEventListener相反 它看起来是这样的:
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);
您只需使用:
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();
}
我发现每一个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();
}
但这些valueEventlistener仅在数据更改时触发,对吗?好问题,忘了提及它们最初触发一次,然后在您查询的数据更改、编辑时触发。您能看看这个问题吗,但这些valueEventlistener仅在数据更改时触发对吗?好问题,忘了提到它们最初被触发一次,然后在您查询的数据发生更改、编辑时被触发。您能看一下这个问题吗