无法从fragment中读取firebase数据

问题描述 投票:0回答:1

我正在 Android Studio 中迈出第一步。我在 Firebase 中有一个数据库,用于存储用户信息,每个条目都由电子邮件地址标识,由于某种原因,我无法检索 [1] 中的条目数据,[1] 代码在扩展 Fragment 的类中运行。而在扩展 AppCompatActivity 的另一个类的函数中也有类似的代码。

知道根本原因是什么吗? 与片段有联系吗?

任何帮助将不胜感激

10x

[1]

   read_Data(indx, new UserCallback() {
        @Override
        public void onCallback(User user) {
            if (user != null) {
                playerdata = user;
            } else {
                showToast("something failed");
            }
        }
    });


private void read_Data(String email, UserCallback callback) {
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Users");
    Query query = reference.orderByChild("email").equalTo(email).limitToFirst(1);

    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            System.out.println("onDataChange! ");
            if (dataSnapshot.exists()) {
                System.out.println("snapshot exists! ");
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    User user = snapshot.getValue(User.class);
                    callback.onCallback(user);
                    return;
                }
            }
            callback.onCallback(null);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {
            System.out.println("On cancelled! ");
            callback.onCallback(null); // Pass null in case of error
        }

    });
}

我尝试在调用 [1] 函数后添加 call thread.sleep(2000) ,认为这可能有帮助,因为 addListenerForSingleValueEvent 是异步的,但事实并非如此

java android firebase firebase-realtime-database
1个回答
0
投票

据我所知,

playerdata
变量被定义为全局变量。当您将
user
对象分配给
playerdata
对象时,使用以下代码行:

playerdata = user;

这并不意味着您可以在课堂上的任何地方使用它。即使您使用回调,该值也仅在读取数据的操作完成后才可用。解决方案总是相同的。任何需要数据库数据的代码都需要位于

onDataChange
onCallback
方法内或从那里调用。由于您使用的是 Java,更好的解决方案是使用 LiveData 对象,因为它可以被观察到。

如果您了解 Kotlin,更好的解决方案是使用 Kotlin 协程

© www.soinside.com 2019 - 2024. All rights reserved.