Java 从Firebase数据库检索跨对象子对象
我试图从Cat1中获取重量和数量,其中Firebase Realtime DB中Cat2中的项目名称、日期和分支相同。但我不知道如何检查这些条件 JSON 到目前为止,我已经做了以下工作:Java 从Firebase数据库检索跨对象子对象,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我试图从Cat1中获取重量和数量,其中Firebase Realtime DB中Cat2中的项目名称、日期和分支相同。但我不知道如何检查这些条件 JSON 到目前为止,我已经做了以下工作: mFishQuery = mFishRef.orderByChild("date").equalTo(mawStock.getDate()); // mFishQuery = mFishRef.orderByKey();//.equalTo(mawStock.getDate()); //
mFishQuery = mFishRef.orderByChild("date").equalTo(mawStock.getDate());
// mFishQuery = mFishRef.orderByKey();//.equalTo(mawStock.getDate());
// Query fishWeight = mFishQuery.orderByChild("item_name").equalTo(mawStock.getItem_name()).getRef().orderByChild("quantity").equalTo(mawStock.getQuantity());
mFishQuery.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
mWeightF = (Double) dataSnapshot.child("fish_weight").getValue();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
mFishRef.child("date").equalTo(mawStock.getDate()).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("Cat2");
ref.orderByChild("item_name").equalTo("item1").addSingleValueEventListener(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot datas: dataSnapshot.getChildren()){
String date=datas.child("date").getValue().toString();
DatabaseReference refer=FirebaseDatabase.getInstance().getReference().child("Cat1");
refer.orderByChild("date").equalTo(date).addSingleValueEventListener(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//retrieve data
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
基本上,您只需要执行足够的itr。接下来,直到迭代器位于第n个位置,其中n是来自nextInt的随机数,然后您可以使用getValue简单地获得所需的对象,下面的示例应该会很好地显示它: 获取随机生成密钥的解决方案
questionsRef = FirebaseDatabase.getInstance().getReference().child("questions").child("DE");
questionsRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
int questionCount = (int) dataSnapshot.getChildrenCount();
int rand = random.nextInt(questionCount);
Iterator itr = dataSnapshot.getChildren().iterator();
for(int i = 0; i < rand; i++) {
itr.next();
}
childSnapshot = (DataSnapshot) itr.next();
question = childSnapshot.getValue(Question.class);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
请尝试以下操作:
mFishQuery = mFishRef.orderByChild("date").equalTo(mawStock.getDate());
// mFishQuery = mFishRef.orderByKey();//.equalTo(mawStock.getDate());
// Query fishWeight = mFishQuery.orderByChild("item_name").equalTo(mawStock.getItem_name()).getRef().orderByChild("quantity").equalTo(mawStock.getQuantity());
mFishQuery.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
mWeightF = (Double) dataSnapshot.child("fish_weight").getValue();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
mFishRef.child("date").equalTo(mawStock.getDate()).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("Cat2");
ref.orderByChild("item_name").equalTo("item1").addSingleValueEventListener(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot datas: dataSnapshot.getChildren()){
String date=datas.child("date").getValue().toString();
DatabaseReference refer=FirebaseDatabase.getInstance().getReference().child("Cat1");
refer.orderByChild("date").equalTo(date).addSingleValueEventListener(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//retrieve data
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
查询时,只能使用一个子项,因此只能使用一个orderByChild或orderByKey
因此,这里有子Cat2的datasnapshot,然后查询item_name=item1的位置,并从数据库中检索日期
然后添加一个嵌套侦听器,并在其中执行一个查询,其中date=date\u已检索,并检索Cat1的数据。最后,我在@Peter Hadad的答案的帮助下解决了这个问题,并对他的答案进行了一些修改
DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("Cat1");
ref.orderByChild("item_name").equalTo("item1").addSingleValueEventListener(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot datas : dataSnapshot.getChildren()){
DatabaseReference refer=FirebaseDatabase.getInstance().getReference().child("Cat1");
refer.orderByChild("date").equalTo(date).addSingleValueEventListener(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
for (Datasnapshot ds : dataSnapshot) {
List<Datasnapshot> list = new ArrayList<>();
list.add(ds);
//compare data and apply logic
}
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
是的,我正在努力。谢谢你的回答,伙计。它帮助我获得了一些进一步发展的逻辑。但是我仍然无法满足条件。你指的是什么条件?比如cat1.item\u name=cat2.item\u name和cat1.date=cat2.date和cat1.quantity=cat2.quantity。是的,这主要是因为你只能使用一个orderByChild,你可能需要稍微更改一下数据库。但在上面,它检查item_name是否等于cat1中的item1,并检索其他数据示例日期。然后检查cat1是否与cat2具有相同的日期,以便检索cat1Cool的数据。现在我明白了。我必须再添加一个侦听器来实现这一点。