我想从Firebase获取传感器的值,并根据该值制作图表。我写了一些代码,但是没有用。该图应自动基于数据库中的值,也就是说,图与值应完全同步。 这是我的数据库:
..sensor
-Lh51ca_FMrRMOA0Ok9B
hum: 36.1
pressure: 1008
temp: 31.2
time: "2019-06-11T13:17:03Z"
-还有很多节点
我使用GraphView制作图表
protected void onCreate(){
....
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot myDataSnapshot : dataSnapshot.getChildren())
{
double temp = myDataSnapshot.child("temp").getValue(Double.class);
double hum = myDataSnapshot.child("hum").getValue(Double.class);
series.appendData(new DataPoint(lastXPoint, temp), false, 1000);
series2.appendData(new DataPoint(lastXPoint, hum), false, 1000);
}
}
只有两个点出现在图表上,仅此而已。
编辑:
protected void onCreate(){
....
reference.addChildEventListener(new ChildEventListener() {
public void onChildAdded(DataSnapshot dataSnapshot, String previousKey) {
for(DataSnapshot myDataSnapshot : dataSnapshot.getChildren())
{
lastXPoint +=0.1d;
double temp = myDataSnapshot.child("temp").getValue(Double.class);
double hum = myDataSnapshot.child("hum").getValue(Double.class);
series.appendData(new DataPoint(lastXPoint, temp), false, 1000);
series2.appendData(new DataPoint(lastXPoint, hum), false, 1000);
}
}
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
public void onCancelled(DatabaseError firebaseError) { }
});
}
更新。现在,该图表将实时更新。似乎效果很好
reference.addChildEventListener(new ChildEventListener() {
public void onChildAdded(DataSnapshot dataSnapshot, String previousKey) {
lastXPoint +=0.1d;
double temp = dataSnapshot.child("temp").getValue(Double.class);
double hum = dataSnapshot.child("hum").getValue(Double.class);
series.appendData(new DataPoint(lastXPoint, temp), false, 1000);
series2.appendData(new DataPoint(lastXPoint, hum), false, 1000);
}
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
public void onCancelled(DatabaseError firebaseError) { }
});
答案 0 :(得分:1)
lastXPoint 变量在循环中似乎是恒定的。因此,您需要在整个循环中一次又一次地将值附加到图形中的同一X点。
您还必须更改 lastXPoint 才能绘制具有DB节点中所有值的连续图形。
编辑:用于复制价值问题
数据库更新后,addvalueeventlistner将再次带回所有节点。要仅使最后添加的节点,请在下面使用。
Firebase ref = new Firebase("YOUR-URL-HERE/PATH/TO/YOUR/STUFF");
ref.addChildEventListener(new ChildEventListener() {
public void onChildAdded(DataSnapshot dataSnapshot, String previousKey) {
}
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
public void onCancelled(FirebaseError firebaseError) { }
});