【问题标题】:Reading From RealtimeDatabase For a Specific Node从实时数据库中读取特定节点
【发布时间】: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


【解决方案1】:
String 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<>();
            if(snapshot.hasChild(date)){
            for (DataSnapshot keyNode : snapshot.getChildren()) {
                //products.clear();
                keys.add(keyNode.getKey());
                //Product product = keyNode.getValue(Product.class);
                String Name = keyNode.child("name").getValue().toString();
                double Cal = Double.parseDouble(keyNode.child("cal").getValue().toString());
                double Carb = Double.parseDouble(keyNode.child("carb").getValue().toString());
                double Prot = Double.parseDouble(keyNode.child("prot").getValue().toString());
                double Fat = Double.parseDouble(keyNode.child("fat").getValue().toString());
                String Unit = keyNode.child("unit").getValue().toString();
                int Def = Integer.parseInt(keyNode.child("def").getValue().toString());
                String Id = keyNode.getKey();
                Product product = new Product(Name, Cal, Carb, Prot, Fat, Unit, Def, Id);
                Log.d("DATA_SUCCESS", "Adding product " + product.getName());
                products.add(product);
                dataStatus.DataIsLoaded(products, keys);
        }
        }else{System.out.print("Date does not exist")}
        }
    }

    @Override
    public void onCancelled(@NonNull @NotNull DatabaseError error) {

    }
});}

尝试这样,希望它有效!然后你应该能够使用你的列表来将数据放在TextView 和那种东西上。我评论了products.clear() 行以将列表保存在“本地”上,而不是在每次迭代时将其删除。如果这对您不起作用,问题一定出在您的日期收集方法或此处date="D_"+date;

【讨论】:

  • 这段代码似乎可以工作,主要问题是日期不存在。例如,如果第一个日期不存在,那么代码就不再工作了。你知道我该如何处理吗?
  • 尝试添加if(snapshot.hasChild(date)){*add for loop here*} 并添加else 语句和System.out.print("Date does not exist") 以检查是否正常工作
  • 我已经编辑了我的答案,方便您处理
  • 问题不在于获取数据,它可能在某处读取 null...
  • 原来问题出在 datepicker 格式中,我忘记在月份中添加 0,所以找不到匹配的节点...无论如何,谢谢您的帮助!!
猜你喜欢
  • 2018-03-17
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
相关资源
最近更新 更多