如何使用 firebase 嵌套查询设置 class 的 属性 值?
How to set a property value of a class using firebase nested query?
我有一个像这样的 firebase 数据结构
Firebase JSON Data
在 Oli 参考文献中有一个 "kategori" 键 (-Ky0RUaYOgB6gks2t3oY),它与 Kategori 参考文献 (-Ky0RUaYOgB6gks2t3oY) 中的子项具有相同的值。我正在尝试从 Oli 引用中检索所有数据,并使用 item as DataOli class.
将其值设置为数组列表
mDbRefOli.orderByChild("nama").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot childDataSnapshot : dataSnapshot.getChildren()) {
final DataOli item = new DataOli();
item.setIdOli(childDataSnapshot.getKey());
item.setNamaOli(childDataSnapshot.child("nama").getValue().toString());
mDbRefKategori.child(childDataSnapshot.child("kategori").getValue().toString()).child("nama").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
item.setKategoriOli(dataSnapshot.getValue(String.class));
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
mDbRefMerk.child(childDataSnapshot.child("merk").getValue().toString()).child("nama").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
item.setMerkOli(dataSnapshot.getValue(String.class));
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
item.setJenisOli(Integer.parseInt(childDataSnapshot.child("jenis").getValue().toString()));
item.setHargaOli(Integer.parseInt(childDataSnapshot.child("harga").getValue().toString()));
item.setKapasitasOli(Double.parseDouble(childDataSnapshot.child("kapasitas").getValue().toString()));
mListOli.add(item);
}
mAdapterOli.notifyDataSetChanged();
mSwlOli.setRefreshing(false);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
而不是获取该密钥并将其显示给用户,我正在尝试从 Kategori 参考 中的子项 (-Ky0RUaYOgB6gks2t3oY) 获取 "Matic" 值以及此代码 item.setKategoriOli(dataSnapshot.getValue(String.class));
用于在项目 class 中设置类别名称。 最后我无法得到那个 "Matic" 值,而是得到空值 。
也许这个问题发生了,因为 AS 要求我在开始时在项目 class 中定义 final,而我试图在另一个内部 class 中设置类别值。你能帮我解决这个问题吗?
//declare the Strings before
DatabaseReference newtables = FirebaseDatabase.getInstance().getReference().child("Oli");
newtables.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
values = dataSnapshot.child("harga").getValue().toString();
jenis=dataSnapshot.child("jenis").getValue().toString();
kap=dataSnapshot.child("kapasitas").getValue().toString();
kat=dataSnapshot.child("kategori").getValue().toString();
merk=dataSnapshot.child("merk").getValue().toString();
nama=dataSnapshot.child("nama").getValue().toString();
DatabaseReference
joins=FirebaseDatabase.getInstance().getReference().child("Kategori");
joins.orderByKey().equalTo(kat).addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
retrieve = dataSnapshot.child("nama").getValue().toString();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
你可以这样做,就像 join
首先从一个节点检索数据然后你使用 id
并查询它并在另一个节点中获取数据。
我有一个像这样的 firebase 数据结构 Firebase JSON Data
在 Oli 参考文献中有一个 "kategori" 键 (-Ky0RUaYOgB6gks2t3oY),它与 Kategori 参考文献 (-Ky0RUaYOgB6gks2t3oY) 中的子项具有相同的值。我正在尝试从 Oli 引用中检索所有数据,并使用 item as DataOli class.
将其值设置为数组列表mDbRefOli.orderByChild("nama").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot childDataSnapshot : dataSnapshot.getChildren()) {
final DataOli item = new DataOli();
item.setIdOli(childDataSnapshot.getKey());
item.setNamaOli(childDataSnapshot.child("nama").getValue().toString());
mDbRefKategori.child(childDataSnapshot.child("kategori").getValue().toString()).child("nama").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
item.setKategoriOli(dataSnapshot.getValue(String.class));
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
mDbRefMerk.child(childDataSnapshot.child("merk").getValue().toString()).child("nama").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
item.setMerkOli(dataSnapshot.getValue(String.class));
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
item.setJenisOli(Integer.parseInt(childDataSnapshot.child("jenis").getValue().toString()));
item.setHargaOli(Integer.parseInt(childDataSnapshot.child("harga").getValue().toString()));
item.setKapasitasOli(Double.parseDouble(childDataSnapshot.child("kapasitas").getValue().toString()));
mListOli.add(item);
}
mAdapterOli.notifyDataSetChanged();
mSwlOli.setRefreshing(false);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
而不是获取该密钥并将其显示给用户,我正在尝试从 Kategori 参考 中的子项 (-Ky0RUaYOgB6gks2t3oY) 获取 "Matic" 值以及此代码 item.setKategoriOli(dataSnapshot.getValue(String.class));
用于在项目 class 中设置类别名称。 最后我无法得到那个 "Matic" 值,而是得到空值 。
也许这个问题发生了,因为 AS 要求我在开始时在项目 class 中定义 final,而我试图在另一个内部 class 中设置类别值。你能帮我解决这个问题吗?
//declare the Strings before
DatabaseReference newtables = FirebaseDatabase.getInstance().getReference().child("Oli");
newtables.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
values = dataSnapshot.child("harga").getValue().toString();
jenis=dataSnapshot.child("jenis").getValue().toString();
kap=dataSnapshot.child("kapasitas").getValue().toString();
kat=dataSnapshot.child("kategori").getValue().toString();
merk=dataSnapshot.child("merk").getValue().toString();
nama=dataSnapshot.child("nama").getValue().toString();
DatabaseReference
joins=FirebaseDatabase.getInstance().getReference().child("Kategori");
joins.orderByKey().equalTo(kat).addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
retrieve = dataSnapshot.child("nama").getValue().toString();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
你可以这样做,就像 join
首先从一个节点检索数据然后你使用 id
并查询它并在另一个节点中获取数据。