为什么Firebase在Lat和Lng上返回Null?

时间:2018-04-11 13:04:11

标签: android google-maps firebase firebase-realtime-database

该错误表示它是一个databox的快速消息(“Latitude”)。getValue(Double.class)可能会产生java.lang.NullPointer异常

这是警告:

  

取消装箱'dataSnapshot.child(“经度”).getValue(Double.class)'可能会产生'java.lang.NullPointerException'较少...(Ctrl + F1)   此检查分析方法控制和数据流,以报告始终为真或假的可能条件,静态证明其值为常量的表达式,以及可能导致可违反合同违约的情况。   标记为@Nullable或@NotNull的变量,方法参数和返回值被视为可空(或分别为非空),并在分析期间用于检查可空性合同,例如,报告可能产生的NullPointerException(NPE)错误。   可以使用@Contract注释定义更复杂的合同,例如:   @Contract(“,null - > null”) - 如果第二个参数为null,则方法返回null @Contract(“,null - > null; _,!null - >!null” ) - 如果第二个参数为null且null为null,则返回null,否则返回@Contract(“true - > fail”) - 一个典型的assertFalse方法,如果将true传递给它,则抛出异常   可以将检查配置为使用自定义@Nullable   @NotNull注释(默认情况下将使用annotations.jar中的注释)

我的Android应用程序从Firebase查找房间的坐标,然后在某个地图上为某个数据放置一个标记。我一直在我的请求中得到一个 null 我已经通过其他人的答案我还没有解决这个问题而且不知道还有什么可以尝试。使用location.getLatitude()location.getLongitude()将坐标发送到Firebase。

public LatLng getCoordsFromFirebase(final String location) {
    if (!location.isEmpty()) {
        //Get the location for the room
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        myRef = database.getReference("locations/");
        DatabaseReference locationsRef = myRef.child(getBlock(location));
        DatabaseReference floorRef = locationsRef.child(getFloor(location));
        DatabaseReference roomRef = floorRef.child(location);
        roomRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.getChildren() != null) {
                    double latitude;
                    double longitude;
                    if (dataSnapshot.child("Latitude").exists() && dataSnapshot.child("Longitude").exists()) {
                            latitude = dataSnapshot.child("Latitude").getValue(Double.class);
                            longitude = dataSnapshot.child("Longitude").getValue(Double.class);
                        classDest = new LatLng(latitude, longitude);
                    } else {
                        System.out.println("Long or Lat were null!!!");
                    }
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                throw databaseError.toException();
            }
        });
    }
    return classDest;
}

以下是我的Firebase上下文:

Firebase Table

Code where the values are being added to Firebase

2 个答案:

答案 0 :(得分:0)

如果仍然出现此错误,请检查Latitude变量的数据类型,然后尝试调试变量并检查其数据类型。

最常见的错误是由于错误的类型inserted由于我们意外地与其他记录不匹配而发生例如您将Latitute作为字符串插入或者您完全忘记添加纬度记录。

答案 1 :(得分:0)

您的roomRef指向数据库中的单个会议室。因此,您无需在dataSnapshot.getChildren()中循环onDataChange()

public void onDataChange(DataSnapshot dataSnapshot) {
    if (dataSnapshot.hasChild("Latitude") && dataSnapshot.hasChild("Longitude")) {
        double latitude = dataSnapshot.child("Latitude").getValue(Double.class);
        double longitude = dataSnapshot.child("Longitude").getValue(Double.class);
        classDest = new LatLng(latitude, longitude);
    } else {
        System.out.println("Long or Lat were null!!!");
    }
}