热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用查询访问节点的子级

这是我在firebase实时数据库上的数据库结构:

这是我在firebase实时数据库上的数据库结构:

使用查询访问节点的子级

我正在尝试访问上一次上载会话下的数据,本例中为 Session9 ,并访问在特定时间获取的传感器读数。

我已查询数据库以在 data 下为我提供最后一个节点,并添加了 ListenerForSingleValueEvent ,在此位置,我正在获取键中的键通过以下方式作为 session9 (仅一项)列出:

Query lastSession = dbref.child("data").limitToLast(1);
lastSession.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull Datasnapshot datasnapshot) {
for (Datasnapshot keyNode : datasnapshot.getchildren()){
keys.add(keyNode.getKey());
Reading reading = node.getvalue(Reading.class);
readings.add(reading);
textView.append(reading.getTemperature());
}
}
}

附加温度会引发此错误:

Attempt to invoke interface method 'int java.lang.CharSequence.length()' on a null object reference

readings是Reading类的数组列表
keys是用于存储键的字符串列表,例如“ 00:00:06”

我犯了一些错误,无法访问要添加到读数列表中的数据。

public class Reading {
private String Date;
private String Time;
private String Humidity;
private String Temperature;
private int Sound;
public Reading(){
}



使用此代码:

dbref = FirebaseDatabase.getInstance().getReference();
Query lastSession = dbref.child("data").orderByKey().limitToLast(1);
lastSession.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot keyNode : dataSnapshot.getChildren()){
for (DataSnapshot ds : keyNode.getChildren()){
keys.add(ds.getKey());
Reading reading = ds.getValue(Reading.class);
readings.add(reading);
}
}

这里的引用位于节点date上,因此,您需要添加两个for循环才能在时间内访问属性。

,

检查代码后,您只会得到钥匙或钥匙,而不会得到孩子

也许这可以帮助您创建第二个查询来访问最后一个节点子节点

Query lastSession = dbref.child("data").limitToLast(1);
lastSession.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot keyNode : dataSnapshot.getChildren()){
String lastItem = keyNode.getKey();
//second query
Query secOndQuery= dbref.child("data").child(lastItem);
secondQuery.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot snap: dataSnapshot.getChildren()){
String temp = snap.child("Temperature").getValue(String.class);
//or you can do this
Reading reads = snap.getValue(Reading.class);
String temp2 = reads.getTemperature();
textView.setText(temp);
}
}
});
}
}
}

,

问题源于您的Reading类的属性无法公开访问以获取/设置其值。

调用DataSnapshot.getValue(YourClass.class)DatabaseReference.setValue(instanceOfYourClass)时,类YourClass必须具有以下内容:


  • 不带参数的公共构造函数。

  • (用于获取值)每个属性的公共可访问的设置器

  • (用于编写值)每个属性的公开获取的吸气剂

getValue(YourClass.class)函数未能在该类的目标实例上设置适当的属性时,它将默默地忽略。

因此,要使您的Reading类兼容,可以使用以下命令进行定义:

public class Reading {
public String Date;
public String Time;
public String Humidity;
public String Temperature;
public int Sound;
public Reading(){
}
}

要纠正潜在的错字:

Query lastSession = dbref.child("data").limitToLast(1);
lastSession.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot keyNode : dataSnapshot.getChildren()){
keys.add(keyNode.getKey());
Reading reading = keyNode.getValue(Reading.class); // changed node to keyNode
readings.add(reading);
textView.append(reading.getTemperature());
}
}
}

进一步阅读:Read/Write Data Documentation


推荐阅读
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 如何使用计算机控制遥控车的步骤和电路制作方法
    本文介绍了使用计算机控制遥控车的步骤和电路制作方法。首先,需要检查发送器的连接器和跳线,以确定命令的传递方式。然后,通过连接跳线和地面,将发送器与电池的负极连接,以实现遥控车的前进。接下来,制作一个简单的电路,使用Arduino命令将连接到跳线的电线接地,从而实现将Arduino命令转化为发送器命令。最后,通过焊接晶体管和电阻,完成电路制作。详细的步骤和材料使用方法将在正文中介绍。 ... [详细]
author-avatar
歪歪Doris
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有