【问题标题】:How to retrieve nested data from firebase如何从firebase检索嵌套数据
【发布时间】:2020-07-03 21:09:32
【问题描述】:

这是我的 firebase 中的数据结构:

我无法检索所有“menukedai”数据。通过使用下面的代码,“menukedai”的数据没有出来。供您参考,“menukedai”的数据将来自用户。

这是我的尝试:

foodDatabaseRef = FirebaseDatabase.getInstance().getReference("uploads").child("menukedai");

foodDatabaseRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
            foodmenu foodmenu = postSnapshot.getValue(foodmenu.class);
            fooddata.add(foodmenu);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Toast.makeText(foodlist.this, databaseError.getMessage(), Toast.LENGTH_SHORT).show();
    }
});

这是我的美食菜单课。

package com.example.trialfoodbuddy;

public class foodmenu {
    private String Foodimage;
    private String Foodname;
    private CharSequence Foodprice;

    public foodmenu(){
        //empty constructor needed
    }
    public foodmenu(String foodimage, String foodname, CharSequence foodprice){
        Foodimage = foodimage;
        Foodname = foodname;
        Foodprice = foodprice;
    }

    public String getFoodimage(){
        return Foodimage;
    }

    public String getFoodname(){
        return Foodname;
    }

    public CharSequence getFoodprice(){
        return Foodprice;
    }

    public void setFoodimage(String foodimage){
        Foodimage = foodimage;
    }

    public void setFoodname(String foodname){
        Foodname = foodname;
    }

    public void setFoodprice(CharSequence foodprice){
        Foodprice = foodprice;
    }
}

【问题讨论】:

  • 请仅使用android-studio 标签来回答有关 Android Studio IDE 本身的问题。对于一般的 Android 编程问题,请使用android 标签。另外:Firebase 实时数据库和 Cloud Firestore 是两个独立的数据库。请仅使用相关标签标记您的问题,不要同时使用两者。
  • 非常感谢先生。之后我会更加了解这个标签。

标签: android firebase firebase-realtime-database


【解决方案1】:

我相信您想要获取嵌套在“menukedai”下的信息,因此您需要为该信息添加另一个循环

foodDatabaseRef = FirebaseDatabase.getInstance().getReference("uploads");
foodDatabaseRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot uploadSnapshot : dataSnapshot.getChildren()) {
            // this is where you actually getting the information 
            for(DataSnapshot menuItemSnapshot : uploadSnapshot.child("menukedai").getChildren()){
                foodmenu foodmenu = menuItemSnapshot.getValue(foodmenu.class);
                fooddata.add(foodmenu);
            }
        }
    }
    // Log the values and check them to make sure you getting the data you want if always nice so I added it for you here
    Log.i("Values","My values are:"+foodmenu);
    @Override
    public void onCancelled(DatabaseError databaseError) {
        Toast.makeText(foodlist.this, databaseError.getMessage(), Toast.LENGTH_SHORT).show();
    }
});

通常来说,您应该始终在数据库中的类中使用变量名,因此当您提取信息时,您的构造函数会知道为您的类中的哪个变量分配什么值。

【讨论】:

  • 感谢您的帮助和提示。我将改进我编写程序的方式。我对此仍有疑问。如果我想要来自“menukedai”的数据怎么办,但它是基于用户 ID 的。例如,如果用户单击第一个 id,则该用户 id 下的“menukedai”中的所有信息都会出现。
  • 在这种情况下,您需要将侦听器附加到foodDatabaseRef.child(uid).addValueEventListener(...,删除for(DataSnapshot menuItemSnapshot 循环,然后在这种情况下删除menuItemSnapshot.child("menukedai").getValue(foodmenu.class)
  • 是这样的吗? ` foodDatabaseRef.child(userid).addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot uploadSnapshot : dataSnapshot.getChildren()) { uploadSnapshot.child("menukedai").getValue(foodmenu.类);}}`
猜你喜欢
  • 2017-12-22
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多