如何将List <marker>的值放入存储在Firebase数据库中的我自己的类中

时间:2016-10-19 06:13:48

标签: android firebase firebase-realtime-database google-maps-markers google-maps-android-api-2

我有这个班级行程:

/**
* Created by alejandro on 18-10-16.
*/

public class Itinerario {

private String nombre;
private String descripcion;
private List<Marker> puntos;
private String fecha;

public Itinerario(String usuario, List<Marker> puntos, String descripcion, String fecha) {

    this.nombre = usuario;
    this.puntos = puntos;
    this.descripcion = descripcion;
    this.fecha = fecha;
}

public String getUsuario() {
    return nombre;
}

public void setUsuario(String usuario) {
    this.nombre = usuario;
}

public String getDescripcion() {
    return descripcion;
}

public void setDescripcion(String descripcion) {
    this.descripcion = descripcion;
}

public List<Marker> getPuntos() {
    return puntos;
}

public void setPuntos(List<Marker> puntos) {
    this.puntos = puntos;
}

public String getFecha() {
    return fecha;
}

public void setFecha(String fecha) {
    this.fecha = fecha;
}
}

我用这种方法保存数据库上的对象:

Itinerario prueba = new Itinerario("Prueba",
                        markers,
                        "desc",
                        String.valueOf(fecha.getTime()));
                myRef.child("myitineraries").child(String.valueOf(fecha.getTime())).setValue(prueba);

我用这个获取Firebase数据库的所有值,然后逐个放入List

//Declare
public ArrayList<Itinerario> resultsItinerarios = new ArrayList<>();


myRefItinerary.child("myitineraries").addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            Itinerario obj = null;

            try {

                List<Marker> map = (List<Marker>) dataSnapshot.child("puntos").getValue();

                obj = new Itinerario(
                        dataSnapshot.child("usuario").getValue().toString(),
                        map,
                        dataSnapshot.child("descripcion").getValue().toString(),
                        dataSnapshot.child("fecha").getValue().toString());

            } catch (Exception e) {

            }

            if (obj != null) {
                //List<Marker>
                resultsItinerarios.add(obj);

            }
        }


        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
            Itinerario obj = null;

            try {

                List<Marker> map = (List<Marker>) dataSnapshot.child("puntos").getValue();

                obj = new Itinerario(
                        dataSnapshot.child("usuario").getValue().toString(),
                        map,
                        dataSnapshot.child("descripcion").getValue().toString(),
                        dataSnapshot.child("fecha").getValue().toString());

            } catch (Exception e) {

            }

            if (obj != null) {
                resultsItinerarios.remove(obj);

            }
        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

但我总是需要在List resultsItinerarios中检索标记的值,

示例:

Toast.makeText(MainActivity.this, "A: " 
+ getResultsItinerarios().get(0).getPuntos().get(0).getPosition().latitude, Toast.LENGTH_SHORT).show();

我收到此错误:

java.lang.ClassCastException: java.util.HashMap cannot be cast to com.google.android.gms.maps.model.Marker

但如果我使用它:

Toast.makeText(MainActivity.this, "A: " 
+ getResultsItinerarios().get(0).getPuntos().get(0), Toast.LENGTH_SHORT).show();

(没有getPosition()。latitude或getPosition()。longitude)我得到的所有值都呈现出纬度和经度。

这是输出:

10-19 03:10:52.203 29076-29076/cl.datacomputer.alejandrob.gogps I/ExampleGOGps: 

{draggable=false, alpha=1, infoWindowShown=false, id=m0, rotation=208877154, visible=true, zindex=0, position={latitude=-33.5174604, longitude=-70.7830533}, flat=false}

我无法找到获取数据的方法,我附上了Firebase数据库的图片。

1

我需要你的帮助。

亲切的问候。

亚历杭德罗B。

1 个答案:

答案 0 :(得分:2)

所有自定义对象都作为Maps / HashMaps存储在Firebase中。因此,如果您需要访问该对象;

像任何其他地图一样访问它

或允许firebase(杰克逊 - 上次我检查过)使用反射

Iterator<DataSnapshot> iterator = dataSnapshot.child("puntos").getChildren().iterator();
List<Marker> markers = new ArrayList<>();

while (iterator.hasNext()) {
      DataSnapshot next = iterator.next();
      String key = next.getKey();
      Marker marker = next.getValue(Marker.class);

      markers.add(marker);
}
//Do this for the others and create you Itenerario Object