如何在 android 中为 firebase 数据库中的动态键和值创建模型 class
How to create a model class for dynamic keys and values in firebase database in android
如何检索模型中的所有关键节点和值class?
Here 是我的数据库模式。
How to create a model class for dynamic keys?
你没办法做到这一点。你 不能 在 class 中有动态变量名。 class 中存在的字段名称应与数据库中存在的字段名称相匹配。但是,有一种方法可以读取动态数据,那就是:
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("MyData").child(uid);
uidRef.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
@Override
public void onComplete(@NonNull Task<DataSnapshot> task) {
if (task.isSuccessful()) {
for (DataSnapshot ds : task.getResult().getChildren()) {
String key = ds.getKey();
String value = ds.getValue(String.class);
Log.d("TAG", key + "/" + value);
}
} else {
Log.d("TAG", task.getException().getMessage()); //Don't ignore potential errors!
}
}
});
假设“S71M ... b7z1”是经过身份验证的用户的 UID,这将起作用。如果不是,则必须在第二个 .child("S71M ... b7z1")
调用中对该值进行硬编码。
以上代码将在 logcat 中产生以下结果:
3/10
13/60
...
此外,请记住,所有值都需要具有相同类型的数据。正如我在您的架构中看到的那样,您没有。有些是字符串,有些是数字:
所以尝试把所有的值都改成字符串,代码可能保持不变,或者,把所有的值都改成数字,使用:
long value = ds.getValue(Long.class);
对于键,您无需执行任何操作,因为所有键都是字符串。
如何检索模型中的所有关键节点和值class?
Here 是我的数据库模式。
How to create a model class for dynamic keys?
你没办法做到这一点。你 不能 在 class 中有动态变量名。 class 中存在的字段名称应与数据库中存在的字段名称相匹配。但是,有一种方法可以读取动态数据,那就是:
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("MyData").child(uid);
uidRef.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
@Override
public void onComplete(@NonNull Task<DataSnapshot> task) {
if (task.isSuccessful()) {
for (DataSnapshot ds : task.getResult().getChildren()) {
String key = ds.getKey();
String value = ds.getValue(String.class);
Log.d("TAG", key + "/" + value);
}
} else {
Log.d("TAG", task.getException().getMessage()); //Don't ignore potential errors!
}
}
});
假设“S71M ... b7z1”是经过身份验证的用户的 UID,这将起作用。如果不是,则必须在第二个 .child("S71M ... b7z1")
调用中对该值进行硬编码。
以上代码将在 logcat 中产生以下结果:
3/10
13/60
...
此外,请记住,所有值都需要具有相同类型的数据。正如我在您的架构中看到的那样,您没有。有些是字符串,有些是数字:
所以尝试把所有的值都改成字符串,代码可能保持不变,或者,把所有的值都改成数字,使用:
long value = ds.getValue(Long.class);
对于键,您无需执行任何操作,因为所有键都是字符串。