【发布时间】:2021-08-13 12:38:05
【问题描述】:
我的 Firebase RealtimeDatabase 包含一个名为 Records 的表。在该表中有 FirebaseUser Uid,在每个 Uid 中都有日期,在每个日期中都有一个产品列表。 This is an example from the firebase console.
在一个名为 DailyTableActivity 的活动中,有一个提示 DatePickerDialog 的按钮和一个 ListView 元素,该元素应该为连接的用户显示对话框中特定日期(或当前日期)的产品。
这是类产品
import java.util.Comparator;
public class Product {
public Product() {
}
private String id;
private String Name;
private double Cal;
private double Carb;
private double Prot;
private double Fat;
private String Unit;
private int Def;
public Product(String name, int cal, int carb, int prot, int fat, String unit, int def,String id) {
Name = name;
Cal = cal;
Carb = carb;
Prot = prot;
Fat = fat;
Unit = unit;
Def = def;
this.id=id;
}
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 double getCal() {
return Cal;
}
public void setCal(double cal) {
Cal = cal;
}
public double getCarb() {
return Carb;
}
public void setCarb(double carb) {
Carb = carb;
}
public double getProt() {
return Prot;
}
public void setProt(double prot) {
Prot = prot;
}
public double getFat() {
return Fat;
}
public void setFat(double fat) {
Fat = fat;
}
public String getUnit() {
return Unit;
}
public void setUnit(String unit) {
Unit = unit;
}
public int getDef() {
return Def;
}
public void setDef(int def) {
Def = def;
}
public static Comparator<Product> productComparator= new Comparator<Product>() {
@Override
public int compare(Product o1, Product o2) {
return o1.getName().toLowerCase().compareTo(o2.getName().toLowerCase());
}
};
}
这是我读取数据的代码:
public void getRecordOfDate( String date , final DataStatus dataStatus)
{
final String currId= FirebaseAuth.getInstance().getCurrentUser().getUid();
date="D_"+date;
DatabaseReference recordsOfUser=FirebaseDatabase.getInstance().getReference().child("records").child(currId);
DatabaseReference dateRef=recordsOfUser.child(date);
dateRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull @NotNull DataSnapshot snapshot) {
if (snapshot.exists()){
List<String> keys = new ArrayList<>();
for (DataSnapshot keyNode : snapshot.getChildren()) {
products.clear();
keys.add(keyNode.getKey());
Product product = keyNode.getValue(Product.class);
Log.d("DATA_SUCCESS", "Adding product " + product.getName());
products.add(product);
dataStatus.DataIsLoaded(products, keys);
}
}
}
@Override
public void onCancelled(@NonNull @NotNull DatabaseError error) {
}
});
}
dataStatus 是一个运行良好的接口,这就是我没有在此处包含它的原因。 我认为我的主要问题来自不存在的日期,但是即使我选择了一个存在的日期,它也不起作用。
我确实认为有必要提一下,如果我选择硬代码中存在的日期,则会读取数据,如下所示:
DatabaseReference dateRef=recordsOfUser.child("D_21_05_2021");
我非常感谢任何帮助和支持,我希望您能帮助我找到解决这个问题的方法,因为我对 NoSQL 数据库不是很熟悉,我想探索 Realtime 的可能性。
【问题讨论】:
-
您应该分享您的数据库 .json 或您正在处理的节点的屏幕截图
-
我添加了一个带照片的链接,请查看...
-
哪种类型的变量是
date,您在其中创建了DatabaseReference? -
我也不明白你为什么要清除你的
products列表每个for迭代来读取数据我会为每个date="D_"+date;节点创建一个变量,然后保存一个product那些变量。但我认为你的阅读代码没问题,我没有看到问题,似乎你正在将参考放在节点上 -
我没有变量,因为我不需要直接访问它。
标签: java android firebase-realtime-database nosql