首页 > 解决方案 > 如何从 Firebase 实时数据库中获取两个变量

问题描述

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 实时数据库中的静态变量中,变量仅在调用方法时获取一次值。使用一个变量,一切正常。如果您更改基础上的值,则变量会更改,但使用两个不起作用。

使用一个变量的示例

标签: javaandroidfirebasefirebase-realtime-database

解决方案


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

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()如果你想在外面使用它们,我建议你从这篇文章中查看我的答案的最后一部分,我在其中解释了如何使用自定义回调来完成它。您也可以观看此视频以更好地理解。


推荐阅读