【问题标题】:Retrieving specific data from Firebase Database从 Firebase 数据库中检索特定数据
【发布时间】:2017-04-05 20:55:09
【问题描述】:

我正在使用 Firebase 数据库和 Java 在 android 上创建一个聊天应用程序。每当用户首次注册时,它将用户名存储到节点user/UserID/profile/username 下的数据库中。用户名使用 User 类存储。这是存储用户名值的地方。但是,当我尝试类似

mDatabase.child("users").child(UserID).child("profile").child("username").toString();

这给了我用户名的路径,但不是用户名本身。有人知道如何获取用户名本身的值吗?

编辑:当我运行时它给了我一个错误

DataSnapshot.child("users").child(mUserID).child("profile").child("username").getValue().toString();

这是我的 Firebase 数据库在 UserID 下显示的内容。

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    您没有正确获得价值。您需要为您的孩子附加一个监听器并获取更新。你这样做:

    // Get a reference to your user
    final FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference ref = database.getReference("server/path/to/profile");
    
    // Attach a listener to read the data at your profile reference
    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Profile profile = dataSnapshot.getValue(Profile.class);
            System.out.println(profile.getUsername());
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {
            System.out.println("The read failed: " + databaseError.getCode());
        }
    });
    

    您可以在 Firebase website 上找到更多信息和示例。请记住,您不会请求从 Firebase 获取数据。您将侦听器附加到孩子,然后从侦听器获取数据。这个例子假设你有一个Profile 模型,有一个获取用户名的方法。这将返回您的 Profile 对象,并使您能够从该对象中获取所需的任何数据。

    【讨论】:

    • 此代码在 ChildEventListener 中。我应该改用 ValueEventListener 吗?
    • 您也可以使用 ChildEventListener。这为您提供了一些其他选项,例如删除、更新、添加等。
    • 如果我不使用模型类怎么办?没有它我将如何检索数据?还是我有必要使用它?
    • 你需要有一个模型类。这是很好的设计。除此之外,您很可能会从中提取其他数据,因此您应该有某种模型。查看您的设计,并找出最适合您的设计。目前你有一个“个人资料”,但也许你想要更多的用户模型,包括姓名、显示名称、地址、电子邮件等。你肯定想要某种模型,它看起来像什么取决于你,但你可以让它包含你现在想要的数据。
    • 好的,谢谢。我对模型类的唯一问题是,每次我尝试从中提取数据时,都会收到一条错误消息,提示我试图在运行时获取对它的空引用
    【解决方案2】:

    试试这个你忘了 getValue() 将返回值而不是路径mDatabase.child("users").child(UserID).child("profile").child("username").getValue().toString();

    【讨论】:

    • 当我尝试使用 getValue 方法时,Android Studio 说它无法解析该方法。知道为什么吗?这是我的代码: String incom_username = mDatabase.child("users").child(mUserId).child("profile").child("username").getValue().toString();
    • 没关系。我使用的是数据库引用而不是 DataSnapshot。谢谢!
    • 实际上,它仍然给我一个错误,说它无法将空对象引用转换为字符串。我会用图片更新我的问题。
    • 这行不通。子函数没有getValue() 方法。这也不会返回任何类型的值。
    猜你喜欢
    • 1970-01-01
    • 2019-02-04
    • 2019-02-07
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 2018-12-09
    • 2021-08-22
    相关资源
    最近更新 更多