如何从Firebase实时数据库中获取两个变量

时间:2018-11-16 11:06:07

标签: java android firebase firebase-realtime-database

static double lat2;

static double lon2;

private void InitMapElements() {

DatabaseReference zonesRef = FirebaseDatabase.getInstance().getReference("markers");

DatabaseReference zone1Ref = zonesRef.child("m-1"); //database path
DatabaseReference zone1NameRef = zone1Ref.child("latit");

DatabaseReference zone2NameRef = zone1Ref.child("longit");

    zone1NameRef.addValueEventListener(new ValueEventListener() { //reading the first coordinate

        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Double lat1 = dataSnapshot.getValue(Double.class);
            lat2 = lat1;
        }

        @Override
        public void onCancelled(DatabaseError error) {
            // Failed to read value
        }
    });
    zone2NameRef.addValueEventListener(new ValueEventListener() { //reading the second coordinate
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Double lon1 = dataSnapshot.getValue(Double.class);
            lon2 = lon1;

        }

       @Override
        public void onCancelled(DatabaseError error) {
        }
    });
}

无法在线获取两个变量,然后将其保存到Firebase实时数据库中的静态变量中,当调用该方法时,变量仅获取一次值。使用一个变量,一切正常。如果您在基准上更改值,则变量会更改,但是两个无效。

example of working with one variable

1 个答案:

答案 0 :(得分:1)

无需附加两个侦听器即可获得这两个值。一个听众可以解决您的问题。要解决此问题,请使用以下代码行:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference ref = rootRef.child("markers").child("m-1");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        double lat = dataSnapshot.child("latit").getValue(Double.class);
        double lon = dataSnapshot.child("longit").getValue(Double.class);
        Log.d(TAG, lat + ", " + lon);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
ref.addListenerForSingleValueEvent(valueEventListener);

如您所见,这两个值都是从DataSnapshot对象中提取的。由于此方法的异步行为,变量latlon都只能在回调内部,onDataChange()内使用。如果您想在外部使用它们,建议您从此 post 中查看anwser的最后一部分,其中我已经解释了如何使用自定义回调来完成。您也可以查看此 video 以获得更好的理解。