繁体   English   中英

从Firebase实时数据库读取数据

[英]Read data from firebase realtime database

在此处输入图片说明

我已经尝试了几个小时才能读取产品分支中的0和1。 请在Firebase数据库中经验丰富的人帮我:(

private void showData(DataSnapshot dataSnapshot) {
    for(DataSnapshot ds : dataSnapshot.getChildren()){
        Food uInfo = new Food();
        uInfo.setName(ds.child("products").getValue(Food.class).getName()); 
        uInfo.setIngredients(ds.child("products").getValue(Food.class).getIngredients()); 
        //display all the information
        Log.d(TAG, "showData: name: " + uInfo.getName());
        Log.d(TAG, "showData: ingredients: " + uInfo.getIngredients());

        ArrayList<String> array  = new ArrayList<>();
        array.add(uInfo.getName());
        array.add(uInfo.getIngredients());
        [ArrayAdapter adapter = new][1] ArrayAdapter(this,android.R.layout.simple_list_item_1,array);
        mListView.setAdapter(adapter);
    }
}

你这样做是错的。

首先,确保您的模型类Food包含您要解析的所有字段。

    public class Food
{
    private String NDB_number;
    private String long_name;
    private String ingredients_english;

    public String getNDB_number() {
        return NDB_number;
    }

    public void setNDB_number(String NDB_number) {
        this.NDB_number = NDB_number;
    }

    public String getLong_name() {
        return long_name;
    }

    public void setLong_name(String long_name) {
        this.long_name = long_name;
    }

    public String getIngredients_english() {
        return ingredients_english;
    }

    public void setIngredients_english(String ingredients_english) {
        this.ingredients_english = ingredients_english;
    }

    public Food(String NDB_number, String long_name, String ingredients_english)
    {
        this.long_name = long_name;
        this.NDB_number = NDB_number;
        this.ingredients_english = ingredients_english;

    }

}

然后您可以按以下方式解析产品

// Get a reference to our Products
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("foodnutrientstest").child("Products");

// Attach a listener to read the products
ref.addValueEventListener(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot dataSnapshot) {
    for(DataSnapshot ds : dataSnapshot.getChildren()){
    Food food = ds.getValue(Food.class);
    //display all the information
    Log.d(TAG, "showData: name: " + food.getLong_name());
    Log.d(TAG, "showData: ingredients: " + food.getIngredients_english());

    }
  }

  @Override
  public void onCancelled(DatabaseError databaseError) {
    System.out.println("The read failed: " + databaseError.getCode());
  }
});

干杯:)

Kotlin解决方案:

class products {
        lateinit var productsDataModel: Products_data_model
        lateinit var productList:ArrayList<Products_data_model>
        val firebasereference=FirebaseDatabase.getInstance().reference.child("foodnutrientstest").child("products")
        .addListenerForSingleValueEvent(object : ValueEventListener {

            override fun onCancelled(p0: DatabaseError) {

            }

            override fun onDataChange(p0: DataSnapshot) {

                for(data in p0.children)
                {
                    val ndb=p0.child("NDB_Number").getValue().toString()
                    val ingredient=p0.child("ingreidents_english").getValue().toString()
                    val long_name=p0.child("long_name").getValue().toString()
                    productsDataModel=Products_data_model(ndb,ingredient,long_name)
                    productList.add(productsDataModel)

                }
                display(productList)
            }
        })



        private fun display(productList: java.util.ArrayList<Products_data_model>) //here you can get all data
    {
                for(i in 0 until productList.size)
                {
                    Log.d("ndb_name",productList[i].name)
                    Log.d("ingredient name",productList[i].ingredient)
                    Log.d("long name",productList[i].long_name)
                }
            }

        }

product_data_model.kt

    class Products_data_model {
        var name:String
        var ingredient:String
        var long_name:String

        constructor(name:String,ingredient:String,long_name:String)
        {
            this.name=name
            this.ingredient=ingredient
            this.long_name=long_name
        }
    }

要获取该数据,只需使用以下代码行:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference productsRef = rootRef.child("Products");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String NDB_number = ds.child("NDB_number").getValue(String.class);
            String ingredients_english = ds.child("ingredients_english").getValue(String.class);
            String long_name = ds.child("long_name").getValue(String.class);
            Log.d(TAG, NDB_number + " / " + ingredients_english + " / " + long_name);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
productsRef.addListenerForSingleValueEvent(valueEventListener);

我使用String类来获取数据,因为没有正确命名字段,并且数据库中的对象将能够映射到Food对象。 有了这些数据,您现在可以创建Food类的新对象并按我需要的方式使用。

您的字段更合适的名称是:

private String ndbNumber;
private String ingredientsEnglish;
private String longName;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM