从Firebase实际数据库中获取值以使用它们制作图表

时间:2019-06-11 11:39:51

标签: java android firebase firebase-realtime-database

我想从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) { }
        });

1 个答案:

答案 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) { }
});