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

标签 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

最佳答案

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

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 中我的答案的最后部分。 其中我解释了如何使用自定义回调来完成它。您还可以看看这个video 为了更好地理解。

关于java - 如何从Firebase实时数据库获取两个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53336613/

相关文章:

android - 我可以向 Firebase 远程配置声明一个数组吗?

Java:计算字符串中整数的个数

java - Xss为1个线程设置线程堆栈大小,所有线程堆栈大小的限制是多少

android - FTS 相对于定制解决方案的优势是什么?

java - NonNull 注释有什么意义?

ios - 如果用户不允许快速通知,则不会调用 didRefreshRegistrationToken

java - 如何在java中在服务器端生成图像[ blob-> string_image -> *.png 或 .jpg ]

c# - 如何编写MIDI(乐器数字接口(interface))应用程序?

java - ScrollView 总是滚动到底部

ios - 在 Xcode 8 (Swift 3) 中手动导入 Firebase Framework