【问题标题】:Retrieve object by id from database of Firebase通过 id 从 Firebase 数据库中检索对象
【发布时间】:2018-04-13 17:51:56
【问题描述】:

我正在编写一个 Android 应用程序,我正在尝试通过 ID 从其 Firebase 相关表中检索“User.java”类的对象。 我找不到我做错了什么;有人可以帮我弄这个吗?我将不胜感激。谢谢。

这是我得到的错误:

com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.Double to type com.example.nidailyas.fitme.User

我的代码:

 DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference();
 mDatabase.child("users").child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                .addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        if (dataSnapshot.exists()) {
                            for (DataSnapshot userDetails : dataSnapshot.getChildren()) {
                                User user = userDetails.getValue(User.class);
                            }
                        }
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

用户.java

import java.util.Date;
public class User {
String userId; //PK
String name;
Date dateOfBirth;
String gender;
double weight;
double height;
double begin_bp_upper;
double getBegin_bp_lower;
int score;
String planningId; //FK
String levelId; //FK
String profileImageUrl;
public User() {
}
public User(String userId, String name, Date dateOfBirth, String gender, double weight, double height, double begin_bp_upper, double getBegin_bp_lower, int score, String planningId, String levelId, String profileImageUrl) {
    this.userId = userId;
    this.name = name;
    this.dateOfBirth = dateOfBirth;
    this.gender = gender;
    this.weight = weight;
    this.height = height;
    this.begin_bp_upper = begin_bp_upper;
    this.getBegin_bp_lower = getBegin_bp_lower;
    this.score = score;
    this.planningId = planningId;
    this.levelId = levelId;
    this.profileImageUrl = profileImageUrl;
}

public String getProfileImageUrl() {
    return profileImageUrl;
}

public String getUserId() {
    return userId;
}

public int getScore() {
    return score;
}

public String getPlanningId() {
    return planningId;
}

public String getLevelId() {
    return levelId;
}

public double getBegin_bp_upper() {
    return begin_bp_upper;
}

public double getGetBegin_bp_lower() {
    return getBegin_bp_lower;
}

public String getName() {
    return name;
}

public Date getDateOfBirth() {
    return dateOfBirth;
}

public String getGender() {
    return gender;
}

public double getWeight() {
    return weight;
}

public double getHeight() {
    return height;
}
}

Firebase db looks like this:

【问题讨论】:

  • Firebase 无法识别Date,您需要使用字符串
  • @Chisko 我已将日期类型更改为字符串,但它仍然不起作用。并再次抛出同样的错误。

标签: java android database firebase


【解决方案1】:

通过使用数据库引用:

mDatabase.child("users").child(FirebaseAuth.getInstance().getCurrentUser().getUid())

您正在调用 users/{userId} 值,该值应从数据库返回单个用户对象。 (考虑到您如何设计数据架构,这是正确的)

onDataChange 参数 dataSnapshot 正在返回用户对象,因此,当您调用 dataSnapshot.getChildren() 时,您要求用户对象的子对象,在这种特殊情况下,这变成了用户(begin_bp_upper,dateOfBirth,性别,...)。

大胆猜测,我认为抛出的异常是因为User user = userDetails.getValue(User.class); 试图将begin_bp_upper(它是一个Double)的值转换为类型User

因此,不要使用 for 语句,而是将 dataSnapshot 视为用户对象:

@Override
public void onDataChange(DataSnapshot dataSnapshot) {
         if (dataSnapshot.exists()) {
               User user = dataSnapshot.getValue(User.class);
         }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-28
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多