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

在我的Firebase数据库里找不到孩子们

翟光赫
2023-03-14

我试图在节点panadol和profinal中获取这些值。但它不起作用。我成功地得到了日期。这是我的密码

for(final String id: MedicinesListActivity.orderIdsList){

        //get the date of the order
        DatabaseReference dateReference = FirebaseDatabase.getInstance()
                .getReference("Orders").child(id);
        dateReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                //date
                String date = dataSnapshot.child("date").getValue(String.class);
                Log.i("Date", date);

                //loop through all the products in the specific order id
                for(DataSnapshot s : dataSnapshot.child(MedicinesListActivity.userId).child("panadol").getChildren()){
                    Order order = s.getValue(Order.class);
                    Log.i("Item_Name", ""+ order.getName());
                }

            }
        });
    }

MedicineListActivity.orderIds-

共有2个答案

宗政颖逸
2023-03-14

似乎在每个用户的节点下,都有一个命名产品的列表(panadol,profint)。您的代码查找一个命名的产品panadol在该列表中的dataSnapshot.child(MedicinesListActivity.userId). child("panadol")

//loop through all the products in the specific order id
for(DataSnapshot s : dataSnapshot.child(MedicinesListActivity.userId).child("panadol").getChildren()){
    Order order = s.getValue(Order.class);
    Log.i("Item_Name", ""+ order.getName());
}

由于您随后迭代了panadol的子节点,因此您的s快照引用了panadol的各个属性:nameorderQuantity。但是您的代码似乎试图将这些属性中的每一个映射到一个完整的Order对象,这是行不通的。

您有两个选择:

>

  • 显示单个属性,而不使用Order类:

    for(DataSnapshot propSnapshot: dataSnapshot.child(MedicinesListActivity.userId).child("panadol").getChildren()){
        Log.i("Item_Name", propSnapshot.getKey() + "="+ propSnapshot.getValue());
    }
    

    不要使用循环,而是以顺序对象获取产品及其属性:

    for(DataSnapshot propSnapshot: dataSnapshot.child(MedicinesListActivity.userId).getChildren()){
        Order order = s.getValue(Order.class);
        Log.i("Item_Name", propSnapshot.getKey() + "="+ propSnapshot.getValue());
    }
    

  • 柴深
    2023-03-14

    要解决此问题,请使用以下代码行:

    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference uidRef = rootRef.child("Orders").child(id).child(uid);
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                String name = ds.child("name").getValue(String.class);
                String orderQuantity = ds.child("orderQuantity").getValue(String.class);
                Log.d("TAG", name + "/" + orderQuantity);
            }
        }
    
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Log.d("TAG", databaseError.getMessage()); //Don't ignore errors!
        }
    };
    uidRef.addListenerForSingleValueEvent(valueEventListener);
    

    logcat中的输出将是:

    panadol/3.0
    profinal/2.0
    

    或者使用命令类:

    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference uidRef = rootRef.child("Orders").child(id).child(uid);
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                Order order = ds.getValue(Order.class);
                Log.d("TAG", ds.getName() + "/" + ds.getOrderQuantity);
            }
        }
    
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Log.d("TAG", databaseError.getMessage()); //Don't ignore errors!
        }
    };
    uidRef.addListenerForSingleValueEvent(valueEventListener);
    

    结果是一样的。

    在这两种情况下,必须使用引用中的所有节点名称才能显示该数据。

     类似资料:
    • UCAEXC::4.0.3用户缺乏权限或找不到对象[我的表的名称] 我想从我在另一个表上执行开始,其他一切都工作得很好... 我在使用: UCANAccess 4.0.3 MS Access 2007 JDK:java 1.8.0_151 NetBeans:NetBeans IDE 8.2 更新 当用console.bat打开数据库时(顺便说一下,这个文件位于UcanAccess下载文件夹中),我

    • 问题内容: 我只是在评估H2数据库…下载并解压缩了安装文件,并连接到的数据库。是我的主目录,不存在(我希望H2创建它)。 控制台似乎可以正常工作。我创建了一个表并向其中插入了一行。即使断开并重新连接控制台,我也可以看到并查询该表。 但是,我没有看到预期的文件。它在哪里? 问题答案: 您确定没有: 文件?如果没有,请尝试以下操作: 它的作用是寻找H2控制台的Java进程,获取其PID并列出该进程的所

    • 我对冬眠很陌生,所以我的问题对你来说很明显。我在H2控制台用3个表(data.mv.db)创建了数据库,插入一些值,然后将其复制到项目路径中的数据库文件夹中。现在我试图阅读其中一个测试,但总是有错误,即表不存在。我试着给连接url添加一些属性,比如连接延迟或者不把字母改成大写,但仍然是一样的。 错误: 我试过编辑配置。所以我补充: 并使数据库为空。奇怪的是,在H2控制台打开后,Java创建的数据库

    • 我最近收到一封来自Firebase的电子邮件,告诉我我的实时数据库有不安全的规则。这些是我设置的规则: 这不是一条安全规则吗? 电子邮件/密码是我启用的唯一登录方法。

    • 其他人有这个奇怪的问题吗?错误消息: 致命错误:未捕获异常“exception”,消息为“DateTime::\uuu construct():无法分析位置17(A)处的时间字符串(2016年1月18日美国/纽约凌晨00:00):在数据库中找不到时区 异常:DateTime::_构造():未能分析位置17(A)处的时间字符串(2016年1月18日美国/纽约凌晨00:00):在数据库中找不到时区 原

    • 但它不起作用。我正在寻找适当的maven依赖。或者我应该从git签出它并部署在我们内部的ArtiFactory中?