作者:歪歪Doris | 来源:互联网 | 2023-06-08 12:50
这是我在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