从Firebase检索复杂的嵌套数据 [英] Retrieve complex nested data from firebase
问题描述
我在firebase中有如下数据:
I have the data in firebase as given below:
我想获取每个表单ID的客户和设备详细信息.表单ID是由Firebase唯一生成的.我只是需要某种方式才能访问这些表单ID.
I want to get the Customer and Device details for each of the Form ID. The Form IDs are generated uniquely by firebase. I just somehow need to get access to these Form IDs.
我将databaseReference设置如下:
I have set the databaseReference as follows:
databaseReference = FirebaseDatabase.getInstance().getReference("users").child(userID).child("forms");
然后我尝试了以下代码来检索所需的数据:
Then I have tried the following code to retrieve the required data:
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot formsSnapshot : dataSnapshot.getChildren()) {
for (DataSnapshot formIDSnapshot : formsSnapshot.getChildren()) {
Device device = formIDSnapshot.getValue(Device.class);
if (device != null) {
// get and use the data
}
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
更新:由于@Frank的回答,我现在已经能够成功检索表单ID.现在,要获取设备和客户详细信息,我必须在获取表单ID之后在ValueEventListener中编写以下代码:
Update: I am now successfully able to retrieve the form IDs, thanks to the answer by @Frank. Now, to get the Device and Customer details I have to write the following code inside the ValueEventListener after getting the form IDs:
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot formsSnapshot : dataSnapshot.getChildren()) {
String formID = formsSnapshot.getKey(); //Retrieving the formID here
//New code addition
// to get the reference to device details node
databaseReference.child(Objects.requireNonNull(formID)).child("Device details").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Device device = dataSnapshot.getValue(Device.class);
if (device != null) {
// required device details here
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException();
}
});
// to get the reference to customer details node
databaseReference.child(Objects.requireNonNull(formID)).child("Customer details").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Customer customer = dataSnapshot.getValue(Customer.class);
if (customer != null) {
//required customer details here
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException();
}
});
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException();
}
});
我知道这是一个凌乱的代码,我希望对此使用更简洁的方法.
I understand that this is a messy code and I would like to get some cleaner approach for the same.
推荐答案
您可以通过调用 DataSnapshot.getKey()
来获取节点的密钥.因此,要获取您的表单ID:
You can get the key of a node by calling DataSnapshot.getKey()
. So to get your form IDs:
databaseReference = FirebaseDatabase.getInstance().getReference("users").child(userID).child("forms");
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot formsSnapshot : dataSnapshot.getChildren()) {
String formID = formsSnapshot.getKey();
Device device = formsSnapshot.getValue(Device.class);
if (device != null) {
// get and use the data
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException(); // never ignore errors
}
});
这篇关于从Firebase检索复杂的嵌套数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!