适用于Android的Firebase数据库,无法检索数据

时间:2018-05-03 05:20:58

标签: java android firebase firebase-realtime-database

所以我在从数据库中检索数据时遇到了麻烦。我认为问题出在退货声明中。

当我运行应用程序时,应显示flatID的调试文本为空白。我确信数据是在数据库上,所以这不是问题。

我对Java和编程一般都很陌生,感谢您的帮助和耐心:)代码如下。

flatID = readFlatID();
debug1.setText(flatID);

    public String readFlatID(){

    String uid = mAuth.getCurrentUser().getUid().toString();

    mDatabase.child("Users").child(uid).child("Flat")
            .addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            flat = dataSnapshot.getValue().toString();
            Toast.makeText(getApplicationContext(),"Data Read Successfully",Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

    return flat;


}

3 个答案:

答案 0 :(得分:0)

Firebase方法是异步的。这就是为什么没有设置文本的原因。您可以设置一个侦听器并将其传递给该方法,以便在获取数据时获得回调。这就是我所说的代码方式:

//Create an interface
    interface IDatabaseLoad {
        void onDataLoadSuccess(String data);
        void onDataLoadFailed();
    }

//Initialize it
IDatabaseLoad databaseLoad = new IDatabaseLoad() {
        @Override
        public void onDataLoadSuccess(String data) {
            debug1.setText(data);
            Toast.makeText(getApplicationContext(),"Data Read Successfully",Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onDataLoadFailed() {

        }
    };

//modify your method
public void readFlatID(final IDatabaseLoad listener){

    String uid = mAuth.getCurrentUser().getUid().toString();

    mDatabase.child("Users").child(uid).child("Flat")
            .addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    listener.onDataLoadSuccess(dataSnapshot.getValue().toString());
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    listener.onDataLoadFailed();
                }
            });
}

现在您只需要调用readFlatID(databaseLoad)TextView将在获取数据后设置数据。

答案 1 :(得分:0)

从Firebase服务器获取数据是在移动设备上的后台线程上执行的,应用程序实际加载整个数据需要一些时间。这就是return flat;在执行代码时不返回任何内容的原因。

最简单的解决方案是,您必须将所有想要处理的数据放在onDataChange()方法中。你可以这样做:

 public void readFlatID() {

        String uid = mAuth.getCurrentUser().getUid().toString();

        mDatabase.child("Users").child(uid).child("Flat")
                .addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        flat = dataSnapshot.getValue().toString();
                        debug1.setText(flat);
                        Toast.makeText(getApplicationContext(), "Data Read Successfully", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

    }

答案 2 :(得分:0)

您现在无法返回尚未加载的内容。 onDataChange()方法具有异步行为,这意味着甚至在您尝试从数据库中获取flat对象之前就会调用该行为。这就是null方法之外总是onDataChange()的原因。换句话说,当您返回flat对象时,数据尚未从数据库中完成加载,因此快速解决此问题的方法是仅在onDataChange()方法中使用该值或者如果你想在外面使用它,请深入到异步世界并创建你自己的回调,如我在 post 的答案的最后部分所述。