当前位置: 首页 > 知识库问答 >
问题:

正在读取特定节点的RealtimeDatabase

娄浩荡
2023-03-14

我的Firebase RealtimeDatabase包含一个名为Records在该表中有FirebaseUser Uid,在每个Uid中有日期,在每个日期中有一个产品列表。这是一个来自firebase控制台的示例。

在一个名为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是一个工作良好的接口,这就是为什么我没有在这里包括它。我认为我的主要问题来自日期不存在,然而,即使我选择了一个存在的日期,它不起作用。

共有1个答案

佴飞驰
2023-03-14
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()行,以将列表保存在“local”上,而不是在每次迭代时删除它。如果这对您不起作用,问题一定出在您日期收集方法上,或者在这里date=“d_”+date;

 类似资料:
  • 所以我正在写一个代码来获取scanf一个文本文件并返回一个格式化的文本消息日志。我一直在想,当文件扫描行“332982000 20555552002 205551001 7 Webb先生,我能问你一个问题吗?”时,如何在某一点扫描文件中的字符串,并打印E.X点以外的所有字符串我将前4个数字扫描为整数,并将其余写入的文本扫描到从“Mr.Webb”开始的字符数组中。 我尝试使用一个for循环与fsca

  • 在语法文件中的某个时候,我希望ANTLR将我的输入读取为2个标记,而不是一个。在我的源文件中,我有 Lexer消耗了 作为浮动标记。在源文件中的这个特定点上,我希望ANTLR将其读取为 12345(内景) 。(点) 姓名(name) 有没有办法告诉ANTLR它应该在某个给定点忽略浮点类型? 这是我的电流。g4文件: 我用的是https://github.com/antlr/grammars-v4/

  • 这是我的XML源: https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml 如何获取DKK(丹麦克朗)的最新汇率? 我不想使用foreach并检查货币是否为DKK... 我需要这样的东西: 知道怎么解决这个问题吗?

  • 我有组织。w3c。dom。具有5个节点的节点列表。UUID生成的节点ID。随机UUID() Dom结构: 我需要获取属性id=“value5”的节点之后的所有节点。因此,结果应该包含id=value6和id=value7的节点。 我创建了流 那么,我可以用Java 8流API来实现这一点吗?

  • 我有一个SVG文档,其中包含类似于以下内容的节点: 我想做的只是选择

  • 问题内容: 我知道 bufio 包中的golang中的特定功能。 Peek返回下一个n个字节, 而不会使阅读器前进 。在下一个读取调用中,字节停止有效。如果Peek返回的字节数少于n个字节,则它还会返回一个错误,解释读取短的原因。如果n大于b的缓冲区大小,则错误为ErrBufferFull。 我需要能够从阅读器读取特定数量的字节,以 使阅读器更先进 。基本上,与上面的功能相同,但是它使阅读器更高级