Firebase getValue()永远不会结束

时间:2018-02-09 10:20:00

标签: java firebase firebase-realtime-database getvalue

我遇到了使用Java的 Firebase 管理员的问题。我使用Firebase实时数据库,我必须读取数据库中特定子项的数据。问题是我使用ValueEventListener来读取数据,但getValue()中的onDataChange永远不会结束或永远不会执行。我试图在我的模型中的特定对象中转换DataSnapshot(其中非基本对象作为属性)。我想这样做:

System.out.println(dataSnapshot.getValue(MyObject.class).toString());

但没有打印出来!我也尝试过这个调用(然后使用,例如,gson):

System.out.println(dataSnapshot.getValue(JSONObject.class).toString());

但没有再打印出来。此代码位于我的ValueEventListener的onDataChange中。我也尝试打印元素的所有单个属性的孩子,我没有问题,但如果我尝试调用getValue(MyObject.class)没有任何反应。我和春天在Heroku上。

这是我的错误?

[编辑]: 这是我想要检索的数据库中的属性:

"ricette" : {
    "-L2yUEiCOkxn4zLISjOm" : {
      "a" : true,
      "approvata" : 1516098247226,
      "autore" : {
        "displayname" : "Matteo",
        "id" : "CaOUusrQLFQDW0rvnC0xkiEBSv42"
      },
      "carboidrati" : 42.584,
      "chiave" : "-L2yUEiE-Zos_y1GcRrv",
      "id" : "-L2yUEiCOkxn4zLISjOm",
      "image" : "url_to_image",
      "ingredienti" : [ {
        "alimento" : {
          "carboidrati" : 1.4,
          "cod" : "1316_2",
          "id" : "9506094d-9986-46a2-b825-c5ad174b936e",
          "kcal" : 57,
          "lipidi" : 1,
          "nome" : "POLPO",
          "proteine" : 10.6,
          "ratio" : 0.08
        },
        "quantita" : 1000
      }, {
        "alimento" : {
          "carboidrati" : 11.4,
          "cod" : "100180_1",
          "id" : "0b520eee-fada-44c6-9544-0072bd8634bc",
          "kcal" : 55,
          "lipidi" : 0.4,
          "nome" : "POMODORO, CONCENTRATO (sostanza secca 18%)",
          "proteine" : 0.9,
          "ratio" : 0.03
        },
        "quantita" : 250
      }, {
        "alimento" : {
          "carboidrati" : 8.4,
          "cod" : "301_1",
          "id" : "44f1b140-b40d-436c-80c7-0ba336c64045",
          "kcal" : 45,
          "lipidi" : 0.6,
          "nome" : "AGLIO, fresco",
          "proteine" : 0.9,
          "ratio" : 0.06
        },
        "quantita" : 1
      }, {
        "alimento" : {
          "carboidrati" : 0,
          "cod" : "338_1",
          "id" : "7077bfc1-bc63-48ea-8647-c596da34416f",
          "kcal" : 30,
          "lipidi" : 0.6,
          "nome" : "PREZZEMOLO, fresco",
          "proteine" : 3.7,
          "ratio" : 0.16
        },
        "quantita" : 10
      } ],
      "inviata" : 1516098091939,
      "kcal" : 710.95,
      "lipidi" : 11.066,
      "nome" : "Polpo in umido",
      "note" : "Nota sul polpo in umido",
      "portata" : "Secondo",
      "proteine" : 108.629,
      "ratio" : 0.07
    }

这些是我的模型中的Java类:

    public class Ricetta implements Serializable {

        private User.Autore autore;
        private String id;
        private String nome;
        private String portata;
        private String note;

        private ArrayList<Alimento.Ingrediente> ingredienti;

        private double lipidi;
        private double proteine;
        private double carboidrati;
        private double kcal;
        private double ratio;
    }

    public class Alimento implements Serializable {

        public Alimento() {
        }

        private String id;
        private String cod;
        private String nome;
        private boolean aggiuntodautente;

        private double lipidi;
        private double proteine;
        private double carboidrati;
        private double kcal;
        private double ratio;
    }



    public class Ingrediente implements Serializable {

        public Ingrediente() {
        }

        private Alimento alimento;
        private int quantita;
}

    public class Autore implements Serializable {

        public Autore() {
        }

        public Autore(String displayname, String id) {
            this.setDisplayname(displayname);
            this.setId(id);
        }

        private String displayname;
        private String id;
}

这是对象,特别是:

public class RicettaG extends Ricetta implements Serializable {

    private String chiave;
    private String image;

    private long inviata;
    private boolean a;
    private long approvata;

}

(与所有吸气者和制定者一起) 问题在于引用dataSnapshot.getValue(RicettaG.class)database.getReference("ricette/-L2yUEiCOkxn4zLISjOm")的调用。也许问题是数据库中不存在属性aggiuntodautente?感谢。

1 个答案:

答案 0 :(得分:0)

当您使用以下代码行时:

System.out.println(dataSnapshot.getValue(MyObject.class).toString());

显然,您正在尝试从数据库中打印数据,但事实并非如此。您正在获取模型类的对象,然后将其强制转换为一个没有意义的字符串,因为您没有覆盖模型类中的toString()方法。您实际打印的内容是来自内存的MyObject对象的地址。

使用以下代码行时:

System.out.println(dataSnapshot.getValue(JSONObject.class).toString());

也是错的。您无法在JSONObject对象上使用getVaue()方法获取dataSnapshot类型的对象。再次,将它转换为String它根本没有任何意义。

假设您的ricette节点是Firebase root的直接子节点,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference ricetteRef = rootRef.child("ricette");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            Ricetta ricetta = ds.getValue(Ricetta.class);
            System.out.println(ricetta.getNome());
        }
    }

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

输出将是nome属性的所有值。