使用 Firebase 数据库显示来自用户 uid 的数据
Display data from user uid with Firebase Database
我想从uid中恢复数据,然后显示在RecyclerView中。
多亏了uid,我成功恢复了child/parent下的取款
这是 Java 中的样子:
referenceWithdraw = FirebaseDatabase.getInstance().getReference().child("Withdraw");
Query queryUid = referenceWithdraw.orderByChild("uid").equalTo(user.getUid());
queryUid.get().addOnCompleteListener(task -> {
if (task.isSuccessful()) {
for (DataSnapshot dataSnapshot : task.getResult().getChildren()) {
String id = dataSnapshot.child("id").getValue(String.class)
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
} else {
///
}
});
String id = ...
检索子值。
到目前为止一切都很好,除了我在
String id = ...
:
referenceWithdraw.child(id).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
WithdrawProfile profile = snapshot.getValue(WithdrawProfile.class);
list.add(profile);
adapter.notifyDataSetChanged();
}
我的 Logcat 中出现此错误:
com.google.firebase.database.DatabaseException: Failed to convert a value of type java.lang.String to int
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertInteger(CustomClassMapper.java:364)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToPrimitive(CustomClassMapper.java:290)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:215)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToType(CustomClassMapper.java:179)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.access0(CustomClassMapper.java:48)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.deserialize(CustomClassMapper.java:593)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.deserialize(CustomClassMapper.java:563)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:433)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:232)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:80)
at com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:203)
at com.pckage.app.android.withdraw.Withdraw.onDataChange(Withdraw.java:62)
at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75)
at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63)
at com.google.firebase.database.core.view.EventRaiser.run(EventRaiser.java:55)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:264)
at android.app.ActivityThread.main(ActivityThread.java:8306)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:632)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1049)
最后是我的 WithdrawProfile:
public class WithdrawProfile {
private String date, email, status, id;
private int prize;
public WithdrawProfile(){}
public WithdrawProfile(String date, String email, String status, String id, int prize) {
this.date = date;
this.email = email;
this.status = status;
this.id = id;
this.prize = prize;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getPrize() {
return prize;
}
public void setPrize(int prize) {
this.prize = prize;
}
}
我的数据库:
{
"Daily" : {
"KuTKHdv1qeYS1NeQVZlqYdZYyNi1" : {
"date" : "07/01/2022"
}
},
"Users" : {
"KuTKHdv1qeYS1NeQVZlqYdZYyNi1" : {
//Other value
"uid" : "KuTKHdv1qeYS1NeQVZlqYdZYyNi1"
}
},
"Withdraw" : {
"-MszSsu9rn6XzRMUNgTc" : {
"date" : "09/01/2022",
"id" : "-MszSsu9rn6XzRMUNgTc",
"email" : "test@gmail.com",
"prize" : "1000",
"statut" : "Pending",
"uid" : "KuTKHdv1qeYS1NeQVZlqYdZYyNi1"
}
}
}
感谢您的宝贵时间
问题出在从数据库中读取这个值:
"prize" : "1000",
在您的 Java class 中,您将 prize
定义为一个整数:
public int getPrize() {
return prize;
}
public void setPrize(int prize) {
this.prize = prize;
}
但在您的数据库中,它存储为字符串值:"1000"
。由于它们不是同一类型,Firebase 无法读取 prize
值并引发错误。
解决方案是将奖品存储为一个(整数)数字:
"prize" : 1000,
或者在您的 Java 代码中也将其设为字符串:
private String prize;
...
public String getPrize() {
return prize;
}
public void setPrize(String prize) {
this.prize = prize;
}
我想从uid中恢复数据,然后显示在RecyclerView中。
多亏了uid,我成功恢复了child/parent下的取款
这是 Java 中的样子:
referenceWithdraw = FirebaseDatabase.getInstance().getReference().child("Withdraw");
Query queryUid = referenceWithdraw.orderByChild("uid").equalTo(user.getUid());
queryUid.get().addOnCompleteListener(task -> {
if (task.isSuccessful()) {
for (DataSnapshot dataSnapshot : task.getResult().getChildren()) {
String id = dataSnapshot.child("id").getValue(String.class)
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
} else {
///
}
});
String id = ...
检索子值。
到目前为止一切都很好,除了我在
String id = ...
:
referenceWithdraw.child(id).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
WithdrawProfile profile = snapshot.getValue(WithdrawProfile.class);
list.add(profile);
adapter.notifyDataSetChanged();
}
我的 Logcat 中出现此错误:
com.google.firebase.database.DatabaseException: Failed to convert a value of type java.lang.String to int
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertInteger(CustomClassMapper.java:364)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToPrimitive(CustomClassMapper.java:290)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:215)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToType(CustomClassMapper.java:179)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.access0(CustomClassMapper.java:48)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.deserialize(CustomClassMapper.java:593)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.deserialize(CustomClassMapper.java:563)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:433)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:232)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:80)
at com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:203)
at com.pckage.app.android.withdraw.Withdraw.onDataChange(Withdraw.java:62)
at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75)
at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63)
at com.google.firebase.database.core.view.EventRaiser.run(EventRaiser.java:55)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:264)
at android.app.ActivityThread.main(ActivityThread.java:8306)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:632)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1049)
最后是我的 WithdrawProfile:
public class WithdrawProfile {
private String date, email, status, id;
private int prize;
public WithdrawProfile(){}
public WithdrawProfile(String date, String email, String status, String id, int prize) {
this.date = date;
this.email = email;
this.status = status;
this.id = id;
this.prize = prize;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getPrize() {
return prize;
}
public void setPrize(int prize) {
this.prize = prize;
}
}
我的数据库:
{
"Daily" : {
"KuTKHdv1qeYS1NeQVZlqYdZYyNi1" : {
"date" : "07/01/2022"
}
},
"Users" : {
"KuTKHdv1qeYS1NeQVZlqYdZYyNi1" : {
//Other value
"uid" : "KuTKHdv1qeYS1NeQVZlqYdZYyNi1"
}
},
"Withdraw" : {
"-MszSsu9rn6XzRMUNgTc" : {
"date" : "09/01/2022",
"id" : "-MszSsu9rn6XzRMUNgTc",
"email" : "test@gmail.com",
"prize" : "1000",
"statut" : "Pending",
"uid" : "KuTKHdv1qeYS1NeQVZlqYdZYyNi1"
}
}
}
感谢您的宝贵时间
问题出在从数据库中读取这个值:
"prize" : "1000",
在您的 Java class 中,您将 prize
定义为一个整数:
public int getPrize() {
return prize;
}
public void setPrize(int prize) {
this.prize = prize;
}
但在您的数据库中,它存储为字符串值:"1000"
。由于它们不是同一类型,Firebase 无法读取 prize
值并引发错误。
解决方案是将奖品存储为一个(整数)数字:
"prize" : 1000,
或者在您的 Java 代码中也将其设为字符串:
private String prize;
...
public String getPrize() {
return prize;
}
public void setPrize(String prize) {
this.prize = prize;
}