android - Android Firebase 从多个节点检索数据作为列表
问题描述
我在我的第一个 android 应用程序中使用 firebase 实时数据库。我试图从firebase检索数据作为“用户名”的arraylist,但我不断地让查询返回一个空结果。我对 firebase 很陌生,所以我真的在为数据检索错误而苦苦挣扎。
"Marchand" : {
"Taha" : {
"adress" : "58 avenu St Eugène ",
"blockage" : false,
"latitude" : 35.7498635,
"longitude" : -0.5566705,
"mail" : "mailmail@gmail.com ",
"password" : "123456",
"signalement" : 0,
"telephone" : "0666666666",
"username" : "Taha"
},
"Yasmine" : {
"adress" : "Address kkdndbdk ",
"blockage" : false,
"latitude" : 35.7498636,
"longitude" : -0.5566704,
"mail" : "randommail@gmail.com",
"password" : "bobo",
"signalement" : 0,
"telephone" : "06999999",
"username" : "Yasmine"
}
.
.
.
这是我的尝试之一,我尝试使用 order-by-child 方法来遍历我拥有的多个节点,但我确信这不是正确的方法,这给了我空指针异常,因为datasnapshot 返回一个NULL值:
referenceMarchand = rootNode.getReference("Marchand");
final ArrayList<String> types = new ArrayList<>();
Query users = referenceMarchand.orderByChild("username");
users.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
types.add(dataSnapshot.child("username").toString());
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
解决方案
让我们利用firebase的一些功能,让我们看看它对你有用。
第1部分)
我们将以另一种方式保存它
"Merchant" : {"Name" : "Taha"
"ID" :"-KSMCMCMnnkd"},//Firebase generated id
{"Name" : "Yasmine"
"ID" :"-KSMCMccccnkd"},//Firebase generated Id
...........
第2部分)
并保存详细信息
"Details" : {
"ID" : "-KSMCMCMnnkd" //Firebase generated id
"adress" : "58 avenu St Eugène ",
"blockage" : false,
"latitude" : 35.7498635,
"longitude" : -0.5566705,
"mail" : "mailmail@gmail.com ",
"password" : "123456",
"signalement" : 0,
"telephone" : "0666666666",
"username" : "Taha"},
{
"ID":"-KSMCMccccnkd" //Firebase generated id
"adress" : "Address kkdndbdk ",
"blockage" : false,
"latitude" : 35.7498636,
"longitude" : -0.5566704,
"mail" : "randommail@gmail.com",
"password" : "bobo",
"signalement" : 0,
"telephone" : "06999999",
"username" : "Yasmine"}
在第 1 部分)
DatabaseRefrence ref = FirebaseDatabase.getInstance("/Path");
String id = ref.child("Merchant").push().getKey(); //Firebase generated id
Merchant merchant = new Merchant();
merchant.setId(id);
merchant.setName("SomeName");
ref.child("Merchant").child(id).setValue(merchant);
第2部分)
Detail detail = new Detail();
detail.setAddress("Some Address");
detail.setBlockage("false");
detail.setLatitude("SomeValue");
detail.setEmail("someText@gmail.com");
......
ref.child("Details").child(id).setValue(detail);
现在
List<Merchant> merchants = new ArrayList<>();
List<Detail> details = new ArrayList<>();
ref.child("Merchant").addValueEventListener(new ValueEventListener(){
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(Datasnapshot snapshot:dataSnapshot){
Merchant merchant = snapshot.getValue(Merchant.class);
merchants.add(merchant);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
ref.child("Details").addValueEventListener(new ValueEventListener(){
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(Datasnapshot snapshot:dataSnapshot){
Detail detail = snapshot.getValue(Detail.class);
details.add(detail);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
现在您可以获取某些商家的详细信息或将其保存在本地数据库中以供以后查询。
推荐阅读
- ada - 如何阻止控制台窗口立即关闭 | GNAT-全球定位系统
- macos - USB 设备没有出现在 macOS 下,甚至没有出现在 USB Prober
- artifactory - 从人工远程仓库下载大文件给出错误 - 意外 EOF
- excel - 将公式应用于单元格范围,然后粘贴值
- tableau-api - Tableau 为三个字段创建通用自定义素材箱
- javascript - 尝试从不同的函数中使用 Async 和 Await
- r - 使用 R 中更改的数据和变量名称运行相同的代码
- c++ - 如何测试文件是否被锁定和/或只读而不打开?
- python - 使用 Python 的密码保护 zip 文件
- amazon-web-services - Amazon Cognito - 有没有办法绕过注册前 Lambda 触发器