【问题标题】:Unable to read data from firebase in android无法从android中的firebase读取数据
【发布时间】:2017-04-07 02:37:15
【问题描述】:

我正在开发 Android 应用程序,其中 Firebase 用于维护移动后端。我在Firebase上有这种格式的数据库

{
  "users" : {
    "-Kh2wjxeT-w26opA0yqe" : {
      "email" : "XX@gmail.com",
      "firstName" : "XX",
      "interest" : {
        "interests" : [ "Cricket", "Table Tennis", "Football" ]
      },
      "lastName" : "XXX",
      "password" : "abcd@1234"
    }
  }
}

Users.java

@IgnoreExtraProperties
public class User {

    public String firstName;
    public String lastName;
    public String email;
    public String password;

    public Interest interest;

    public User() {
        // Default constructor required for calls to DataSnapshot.getValue(User.class)
    }

    public User(String firstName, String lastName, String email, String password, Interest interest) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
        this.password = password;
        this.interest = interest;
    }
}

兴趣.java

public class Interest {

    public List<String> interests;

    public Interest() {
        // Default constructor required for calls to DataSnapshot.getValue(User.class)
    }

    public Interest(List<String> interests) {
        this.interests = interests;
    }
}

我以这种方式在子“用户”上添加了addValueEventListener

mDatabase.child("users").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot noteDataSnapshot : dataSnapshot.getChildren()) {
            User user = dataSnapshot.getValue(User.class);
            Log.d("Scheduled", user.firstName + user.lastName + user.interest.interests.toString());
        }
    }

    @Override
    public void onCancelled(DatabaseError error) {
        // Failed to read value
    }
});

它正在获取我在Firebase 上的正确数据,但它没有映射Users java 对象中的数据,所以当我无法访问值时。我不确定我在这里犯了什么错误。

Log.d("预定", user.firstName + user.lastName + user.interest.interests.toString());

【问题讨论】:

  • 在您的 Interest 类中,不要使用 List&lt;String&gt;,而是使用 Map&lt;String, Object&gt;。它肯定会起作用。并且不要忘记在模型类中设置公共设置器和获取器。
  • 我猜问题是因为创建了唯一 ID `“-Kh2wjxeT-w26opA0yqe”,而我在 User.java 中没有类似的东西
  • @AlexM。我也尝试了`HashMap,但它不起作用
  • 威廉姆斯,请改造你的班级。删除您的 Interest 类并在 User 类中创建一个名为 interestMap。而不是创建公共 setter 和 getter。
  • @AlexM。我已经完成了pastebin.com/hvM8TxbK 它不工作

标签: android firebase firebase-realtime-database


【解决方案1】:

为了显示数据,您需要像这样更改代码:

mDatabase.child("users").child(userId).addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
        String firstName = dataSnapshot.child("firstName").getValue(String.class); 
        Log.d("Scheduled", firstName); 
    } 

    @Override 
    public void onCancelled(DatabaseError error) { 
    // Failed to read value 
    } 
});   

其中userIdpush()方法生成的唯一id。

【讨论】:

    【解决方案2】:

    您是否将 dataSnapshot 映射到正确的 java 类?

    因为我看到您已将文件命名为 Users.java,并且当您获取值时,您为用户创建对象。

                User user = dataSnapshot.getValue(User.class);
    

    应该是

    Users user = dataSnapshot.getValue(Users.class);
    

    只是好奇你的命名是否正确。

    并且还为用户使用地图而不是列表,它肯定会起作用。

    `

    【讨论】:

    • 我有User.java,我猜是因为创建了唯一ID `“-Kh2wjxeT-w26opA0yqe”`
    • 如果我在这里使用 List/Map 有什么区别?
    • 是的,只需在您的兴趣类中使用 HashMap 而不是 List,这样您就可以将唯一的 Id 映射到每个对象
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-25
    • 1970-01-01
    相关资源
    最近更新 更多