【问题标题】:Retrieve attributes of child from Firebase to android app using ValueEventListener使用 ValueEventListener 将子属性从 Firebase 检索到 android 应用
【发布时间】:2017-07-26 15:28:25
【问题描述】:

我的数据库结构:

当在明文字段中输入“Apple”或“Orange”等键时,我想在 Textview 中检索所有详细信息(卡路里、碳水化合物、脂肪、蛋白质)。

这是我用来检索数据的代码,但我的应用程序在运行时不断崩溃:

    bdata.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(Diet.this, "here", Toast.LENGTH_SHORT).show();
            final String food_item = etfooditem.getText().toString().trim();
            Toast.makeText(Diet.this, food_item, Toast.LENGTH_SHORT).show();
  databasesReference.addValueEventListener(new com.google.firebase.database.ValueEventListener() {
      @Override
      public void onDataChange(com.google.firebase.database.DataSnapshot dataSnapshot) {
          for (com.google.firebase.database.DataSnapshot ds : dataSnapshot.child("Food_Databse").getChildren()) {
              Getters getter;
              getter = (Getters) ds.getValue();
              if (food_item == getter.getName()) {

                  String abc = getter.getCal();
                  Toast.makeText(Diet.this, abc, Toast.LENGTH_SHORT).show();
                  break;
              }else{
                  Toast.makeText(Diet.this, "Failed", Toast.LENGTH_SHORT).show();
              }
              //getter.getCarb();
              //getter.getFat();
              //getter.getPro();
          }
      }

      @Override
      public void onCancelled(DatabaseError databaseError) {

      }
  });

        }


    });

【问题讨论】:

  • 什么是吸气剂?
  • 发布你的日志

标签: android firebase firebase-realtime-database


【解决方案1】:

为了解决您的问题,请使用以下代码:

EditText editText = (EditText) findViewById(R.id.edit_text);
String fruit = editText.getText().toString();

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference fruitRef = rootRef.child("Food-Databse").child(fruit);
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String calories = ds.child("Calories").getValue(String.class);
            String carbohydrates = ds.child("Carbohydrates").getValue(String.class);
            String fat = ds.child("Fat").getValue(String.class);
            String protein = ds.child("Protein").getValue(String.class);
            Log.d("TAG", calories + " / " + carbohydrates + " / " + fat + " / " + protein);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
fruitRef.addListenerForSingleValueEvent(eventListener);

请注意,我在您的屏幕截图中看到我使用了Food-Databse,而不是通常使用的Food-Database

希望对你有帮助。

【讨论】:

    【解决方案2】:

    首先我建议在键之外添加一个名称字段

    Query foodsQuery = database.getReference("Food_Databse");
    foodsQuery.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for(DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                    Food food = postSnapshot.getValue(Food.class);
                    //don't need it if you add name child field (see comment in class)
                    food.name = postSnapshot.getKey();
                }
            }
    
            @Override
            public void onCancelled(DatabaseError databaseError) {
    
            }
        }
    );
    

    您可能想要创建一个 Food 类(在单独的文件中!!)

    public class Food {
        String name = "";
        int calories;
        int carbohydrates;
        int fat;
        int protein;
    
        public Food() {
        }
    
        /*
        //uncomment iff you add name child field in database
        public int getName() {
            return id;
        }
        public void setName(String val) {
            this.id = id;
        }
        */
        public int getCalories() {
            return id;
        }
        public void setCalories(int val) {
            this.id = id;
        }
        public int getCarbohydrates() {
            return id;
        }
        public void setCarbohydrates(int val) {
            this.id = id;
        }
        public int getFat() {
            return id;
        }
        public void setFat(int val) {
            this.id = id;
        }
        public int getProtein() {
            return id;
        }
        public void setProtein(int val) {
            this.id = id;
        }
    }
    

    你可以使用 Food 类而不是使用

    HashMap<String, Object> map = (HashMap<String, Object>)postSnapshot.getValue()
    

    或者如果所有值都是整数:

    HashMap<String, Integer> map = (HashMap<String, Integer>)postSnapshot.getValue()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-23
      • 1970-01-01
      • 2018-09-23
      • 2016-12-22
      • 2018-08-16
      • 2021-06-30
      相关资源
      最近更新 更多