【问题标题】:Firebase (android) not returning the reference for an ObjectFirebase(android)不返回对象的引用
【发布时间】:2018-02-27 18:48:03
【问题描述】:

我正在尝试从我的 Firebase 实时数据库中检索 Usuario 对象。

命令p.getOferecedor() 返回第二张图像的oferecedor 字段上突出显示的值,该值与我正在尝试检索的正确usuario 的UUID 匹配。

我可以从 Android Studio 的调试器中看到(参见第 3 张图片)引用确实设置到了正确的位置,但是(参见第 1 张图片)虽然引用设置正确,但我得到了 null 值对象的所有字段。
非常感谢任何帮助。
这是代码的相关部分:

        DatabaseReference dbRef;
        dbRef = FirebaseDatabase.getInstance().getReference();
        dbRef.child("usuario").child(p.getOferecedor());

        dbRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                User user = dataSnapshot.getValue(User.class);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

很抱歉混淆了第二张图片其余部分的字段,但这是我正在为一家公司开发的应用程序,所以我向您显示的信息越小,我失去这个的风险就越小工作。

Edit1 - User.java 文件和 dataSpanshot.getValue().toString 值
来自 p.getOferecedor 的值:(直接来自 LogCat)

onDataChage: returnString: 9t00TAdw2LXCzS8hyrETqTrESVk2

来自 dataSpanshot.getValue().toString 的值:(直接来自 LogCat)

onDataChage: returnString: {usuario={9t00TAdw2LXCzS8hyrETqTrESVk2={email=pegaiarsa@gmail.com, sobrenome=Palumbo Gaiarsa , crm=0, nome=Pedro, uuid=9t00TAdw2LXCzS8hyrETqTrESVk2}}, plantao={-L6NJKWt9HUR_KG4Qo49={anoFim=2018, minutoFim=30, mesFim=1, inicio=false, remuneracao=3333333, minutoInicio=30, diaInicio=27, diaFim=27, mesInicio=1, local=Kkkkkkk, anoInicio=2018, oferecedor=9t00TAdw2LXCzS8hyrETqTrESVk2, horaFim=14, horaInicio=14}, -L6NHkctPMYGmcOPeyLl={anoFim=2018, minutoFim=24, mesFim=1, inicio=false, remuneracao=3333, minutoInicio=24, diaInicio=27, diaFim=27, mesInicio=1, local=Foda-se , anoInicio=2018, oferecedor=9t00TAdw2LXCzS8hyrETqTrESVk2, horaFim=14, horaInicio=14}, -L6NH_3l4akzIfcJhrv_={anoFim=2018, minutoFim=23, mesFim=1, inicio=false, remuneracao=6666, minutoInicio=23, diaInicio=27, diaFim=27, mesInicio=1, local=Ooop, anoInicio=2018, oferecedor=Jh12qQACjOMyvo3Uo0LEVeitp843, horaFim=14, horaInicio=14}}, historico={9t00TAdw2LXCzS8hyrETqTrESVk2={oferecido={-L6NHkcvnSeJNqLcd5QS={anoFim=2018, minutoFim=24, mesFim=1, inicio=false, uuid=-L6NHkctPMYGmcOPeyLl, remuneracao=3333, minutoInicio=24, diaInicio=27, diaFim=27, mesInicio=1, local=Foda-se , anoInicio=2018, oferecedor=9t00TAdw2LXCzS8hyrETqTrESVk2, horaFim=14, horaInicio=14}, -L6NJKX4n3gjg6ieQmid={anoFim=2018, minutoFim=30, mesFim=1, inicio=false, uuid=-L6NJKWt9HUR_KG4Qo49, remuneracao=3333333, minutoInicio=30, diaInicio=27, diaFim=27, mesInicio=1, local=Kkkkkkk, anoInicio=2018, oferecedor=9t00TAdw2LXCzS8hyrETqTrESVk2, horaFim=14, horaInicio=14}}}}}

User.java 包点.cursoandroid.com.medpoint;

public class User {

    private String nome;
    private String sobrenome;
    private String email;
    private String telefone;
    private String UUID;
    private int crm;
    private String[] ocupacao;

    public User() {
    }

    public String getUUID() {
        return UUID;
    }

    public void setUUID(String UUID) {
        this.UUID = UUID;
    }

    public int getCrm() {
        return crm;
    }

    public void setCrm(int crm) {
        this.crm = crm;
    }

    public String[] getOcupacao() {
        return ocupacao;
    }

    public void setOcupacao(String[] ocupacao) {
        this.ocupacao = ocupacao;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getSobrenome() {
        return sobrenome;
    }

    public void setSobrenome(String sobrenome) {
        this.sobrenome = sobrenome;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }
}

【问题讨论】:

  • 获得空引用有两个原因。由于数据库规则,您无权访问该节点,或者您没有获得正确的节点路径。
  • 你能给我们p.getOferecedor()的返回字符串吗?你能把你的User.java文件过去吗?如果你打印dataSnapshot.getValue().toString() 你会得到什么?
  • @shadowsheep 你去吧
  • 所以一个问题是您的数据库参考。您指向您的根目录,但您想获取用户。您必须对您的孩子有第二个数据库引用。然后尝试使用一个简单的 User 类,就像我建议的那样。

标签: android firebase firebase-realtime-database


【解决方案1】:

一个问题是您正在引用您的数据库根目录。

您要做的是获取指向您孩子的第二个数据库引用并使用它:

DatabaseReference dbRef;
dbRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference childRef = dbRef.child("usuario").child(p.getOferecedor());

childRef.addListenerForSingleValueEvent(new ValueEventListener() {
    ...

另一个在您的User 课程中。

如果您阅读documentation,您会发现如果您使用 POJO 从实时数据库中读取数据,您只需要使用这种类型:

  • String
  • Long
  • Double
  • Boolean
  • Map<String, Object>
  • List<Object>

所以您需要将您的String[] 字段转换为List<String>

或者为了拥有一个复杂的字段,您需要拥有另一个 java POJO(普通旧 Java 对象)。

我的建议是尝试使用最简单的字段,并在使用最简单的 POJO 测试完 POJO 后一个接一个地添加复杂的字段。

所以试试User.java

@IgnoreExtraProperties
public class User {

    public String nome;
    public String sobrenome;
    public String email;
    public String uuid;

    public User() {
    }
}

这是因为如果通过反射创建 POJO 出现问题,您会得到一个 null 引用。

【讨论】:

  • 非常感谢。我会将String 字段转换为List<String>。现在,对子 ref 的更改就足够了。最好的问候
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 2018-11-11
  • 1970-01-01
  • 2019-01-07
  • 2015-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多