在我的Firebase database
中,我有两个孩子让Child1,Child2。 Child1 包含用户的个人资料信息Root/Child1/Uid-User(x)/User_details
。 Child2 包含用户以Root/Child2/Uid-User(x)/Transaction_details
完成的交易。我想检索一个用户的用户配置文件信息,然后检索同一用户的事务,然后将其存储在某个对象中。然后分析另一个用户的信息,他的交易并将其存储在另一个对象中,依此类推。
我该怎么做?因为Firebase方法异步运行所以如果我创建一个方法从Child1检索另一个方法用于Child2,那么它们会异步执行并产生问题。
答案 0 :(得分:0)
您可以检索它最初通过将监听器放入userDetail节点完成此操作后,请确保在再次请求检索其转换数据后,检索到的数据不应为null
或者您分别检索两者并将结果放入2 HashMap中,一旦从两个侦听器检索到的数据,您可以根据键合并它们(确保两个地图的长度应相同)
要确保调用两个侦听器,您可以这样做
最初放两个变量
userProfileHit = 0;
userTransctionHit = 0;
privte void userList () {
userProfileHit ++;
private ValueEventListener userListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//retriveData
userProfileHit --;
doMergingTask ();
}
@Override
public void onCancelled(DatabaseError databaseError) {
userProfileHit --;
doMergingTask ()
}
};
}
private void transctionList () {
userTransctionHit ++;
private ValueEventListener transctionListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
userTransctioneHit --;
doMergingTask ()
}
@Override
public void onCancelled(DatabaseError databaseError) {
userTransctionHit --;
doMergingTask ()
}
};
}
private void doMergingTask () {
if (userTransctionHit == 0 && userProfileHit == 0) {
// Check Datas are valid and merge it
}
}
答案 1 :(得分:0)
我的建议是,您将用于检索用户事务的方法放在onDataChanged
方法中以检索配置文件信息。这样,当您获得用户配置文件信息时,可以使用它来获取用户事务信息并创建对象。您可以嵌套firebase事件侦听器以生成所需的任何结果。
例如:
final FirebaseDatabase database = FirebaseDatabase.getInstance();
final DatabaseReference ref = database.child("profile");
// Attach the first listener to read the data at our profile reference
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
final Profile profile = dataSnapshot.getValue(Profile.class);
DatabaseReference transactionRef = database.child("transaction");
// Attach a listener to read the data at our transactions reference
transactionRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Transaction transaction = dataSnapshot.getValue(Transaction.class);
//
//Do stuff with the Transaction object and Profile object here.
//
}
@Override
public void onCancelled(DatabaseError databaseError) {
System.out.println("The read failed: " + databaseError.getCode());
}
});
}
@Override
public void onCancelled(DatabaseError databaseError) {
System.out.println("The read failed: " + databaseError.getCode());
}
});