Firebase LatLng缺少一个没有参数的构造函数

时间:2016-12-16 20:29:00

标签: android firebase firebase-realtime-database

我将坐标存储在实时数据库中,并且在尝试检索数据时收到错误消息。错误消息是

  

com.google.firebase.database.DatabaseException:类com.google.android.gms.maps.model.LatLng缺少没有参数的构造函数

...

  

在com.google.firebase.database.DataSnapshot.getValue(未知来源)

这是代码

Main.java

protected void onStart() {
        apiClient.connect();
        super.onStart();

        DatabaseReference test = database.getReference("jsierra");

        test.addChildEventListener(new ChildEventListener() {

            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                Toast.makeText(getBaseContext(), "Child Added", Toast.LENGTH_LONG).show();
                givenData = dataSnapshot.getValue(data.class); <-- Error
            }
}

data.java

import com.google.android.gms.maps.model.LatLng;
public class data {
    private LatLng coordinates;

    public data() {
        coordinates = null;
    }

    public data(LatLng coordinates)
    {
        this.coordinates = coordinates;
    }

    public void setLatLng(LatLng coordinates) {
        this.coordinates = coordinates;
    }

    LatLng getLatLng () {
        return coordinates;
    }
}

2 个答案:

答案 0 :(得分:11)

创建您自己的LatLng模型类,而不是使用Google地图库中的模型类,因为它在实现中缺少公共构造函数。

public class LatLng {
    private Double latitude;
    private Double longitude;

    public LatLng() {}

    ... public getter ...
}

编辑:如何将此LatLng转换为com.google.android.gms.maps.model.LatLng

com.google.android.gms.maps.model.LatLng mapsLatLng = 
    new com.google.android.gms.maps.model.LatLng(latLng.getLatitude(),
                                                 latLng.getLongitude());

答案 1 :(得分:1)

当我尝试将Timestamp传递给数据库时,我遇到了类似的问题。虽然getter工作并且我的数据通过push正确设置为实时数据库,但是使用来自ChildEventListener的DataSnapshot读取数据会导致我的应用程序崩溃,因为Timestamp类也没有没有争论的公共cunstructor。 所以我创建了自己的类Timestamp,它扩展了原始的java Timestamp类,添加了缺少公共构造函数而没有争论。

public class Timestamp extends java.sql.Timestamp {

public Timestamp(long time) {
    super(time);
}

public Timestamp(){
    super(System.currentTimeMillis());

}

然后我必须包括所需的setter(从使用我的新类时的警告中读取)