从firebase返回不正确的布尔值



我正试图从Firebase数据库读取数据,并将其映射到其应用程序中的**User**类对象。Firebase中的数据包含一个名为"IsOrganization"带有布尔值。但是,当开发人员检索数据并将其映射到User类对象时,**isOrganization()**方法总是返回**false**,即使Firebase中的值是**true**。我正在寻求帮助来识别和纠正代码或数据库中的问题,以准确地反映来自Firebase的布尔值。

My Realtime Direbase数据格式:

{
"Address": "Moheshkhali",
"Email": "xyz@gmail.com",
"FreeSeat": 0,
"ID": "HOYs7Dz6KHcQKBfJe8A2Uz6qbB52",
"Image": "xyz",
"IsOrganization": true,
"NID": "052394284539",
"Name": "ARVOVIRUS",
"Phone": "01852369741",
"TotalSeat": 0
}

模型类User.java:

public class User {
private String ID, Name, Email, Phone, NID, Address, Image;
private boolean IsOrganization;
private int TotalSeat, FreeSeat;
public User() {}
public User(String ID, String name, String email, String phone, String NID, String address,
String image, boolean isOrganization, int totalSeat, int freeSeat) {
this.ID = ID;
this.Name = name;
this.Email = email;
this.Phone = phone;
this.NID = NID;
this.Address = address;
this.Image = image;
this.IsOrganization = isOrganization;
this.TotalSeat = totalSeat;
this.FreeSeat = freeSeat;
}
public String getID() {
return ID;
}
public void setID(String ID) {
this.ID = ID;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getEmail() {
return Email;
}
public void setEmail(String email) {
Email = email;
}
public String getPhone() {
return Phone;
}
public void setPhone(String phone) {
Phone = phone;
}
public String getNID() {
return NID;
}
public void setNID(String NID) {
this.NID = NID;
}
public String getAddress() {
return Address;
}
public void setAddress(String address) {
Address = address;
}
public String getImage() {
return Image;
}
public void setImage(String image) {
Image = image;
}
public boolean isOrganization() {
return IsOrganization;
}
public void setOrganization(boolean organization) {
IsOrganization = organization;
}
public int getTotalSeat() {
return TotalSeat;
}
public void setTotalSeat(int totalSeat) {
TotalSeat = totalSeat;
}
public int getFreeSeat() {
return FreeSeat;
}
public void setFreeSeat(int freeSeat) {
FreeSeat = freeSeat;
}
}

用于读取数据库并在应用程序中显示:

databaseReference.child(HOYs7Dz6KHcQKBfJe8A2Uz6qbB52)
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if (snapshot.exists()) {
User users = snapshot.getValue(User.class);
boolean isOrganization = users.isOrganization();
Log.i("isOrganization: ", String.valueOf(isOrganization )); // It show flase in logcat
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {

}
});
在Logcat

:isOrganization:: false

您将在logcat中获得false:

isOrganization:: false

因为您正在读取字段的默认值,而不是来自数据库的值。Firebase总是尝试使用JavaBean命名约定将节点内的字段与类中存在的字段进行映射。

在你的情况下,这样的映射是不可能的,因为你的User类中的getterisOrganization()不能返回一个名为IsOrganization的字段,因为我看到它存在于你的数据库中。参见大写字母I?

解决方法很简单。你可以像这样在getter前面使用注释:

@PropertyName("IsOrganization")
public String isOrganization() { return IsOrganization; }

或者,如果您只想读取IsOrganization字段的值,那么实际上不需要将该节点映射到类型为User的对象。您只能像这样读取字段的值:

DatabaseReference db = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = db.child("HOYs7Dz6KHcQKBfJe8A2Uz6qbB52");
//                                                       👇
DatabaseReference isOrganizationRef = uidRef.child("IsOrganization");
isOrganizationRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if (snapshot.exists()) {
boolean isOrganization = snapshot.getValue(Boolean.class);
Log.i("isOrganization: ", String.valueOf(isOrganization));
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Log.d("TAG", error.getMessage()); //Never ignore potential errors!
}
});

logcat的结果现在将是:

isOrganization:: true

我使用@PropertyName注释显式地将JSON字段映射到User类中的字段。下面是更新后的User类:

import com.google.firebase.database.PropertyName;
public class User {
private String ID, Name, Email, Phone, NID, Address, Image;
private boolean IsOrganization;
private int TotalSeat, FreeSeat;
public User() {}
public User(String ID, String name, String email, String phone, String NID, String address,
String image, boolean isOrganization, int totalSeat, int freeSeat) {
this.ID = ID;
this.Name = name;
this.Email = email;
this.Phone = phone;
this.NID = NID;
this.Address = address;
this.Image = image;
this.IsOrganization = isOrganization;
this.TotalSeat = totalSeat;
this.FreeSeat = freeSeat;
}
// ... Other getters and setters
@PropertyName("IsOrganization")
public boolean isOrganization() {
return IsOrganization;
}
@PropertyName("IsOrganization")
public void setOrganization(boolean organization) {
IsOrganization = organization;
}
// ... Other getters and setters
}

将@PropertyName("IsOrganization"注释添加到IsOrganization字段的getter和setter方法中,显式地告诉Firebase将JSON数据中的IsOrganization字段映射到User类中的IsOrganization字段。这将修复isOrganization()方法返回不正确值的问题。

最新更新