将Arraylist <latlng>的多个实例存储到共享首选项

时间:2015-05-08 11:18:41

标签: android google-maps arraylist

目前我有一个跟踪用户位置并使用折线和地图标记绘制路线的应用程序,我需要将包含LatLng坐标的arraylist添加到另一个存储所有路径的数组列表中, latlng arraylist是一条路线,所以我需要将所有路线存储在一个arraylist中并将其存储在共享首选项中,这样我就可以将用户已经采取的所有路线加载到地图中。 到目前为止,我只存储了一条到共享首选项的路由,并在每次添加新路由时覆盖它。

这是我到目前为止,这两个类保存了latlng数据

public void addToJSONArray(JSONArray array, LatLng item) throws Exception {

    JSONObject data = new JSONObject();
    data.put("latitude", item.latitude);
    data.put("longitude", item.longitude);

    array.put(data);


}


  public void saveJourney(Context context, JSONArray saveData) {
    SharedPreferences storeAllRoutes = context.getSharedPreferences("STORED_ROUTES", context.MODE_PRIVATE);

    Editor editor = storeAllRoutes.edit();
    editor.putString("saveData",saveData.toString());
    editor.commit();

}

这两个类检索数据

public JSONArray getData(Context context) throws Exception{
    SharedPreferences storeAllRoutes = context.getSharedPreferences("STORED_ROUTES", context.MODE_PRIVATE);

    if(storeAllRoutes.contains("saveData")) {
        return new JSONArray(storeAllRoutes.getString("saveData", ""));
    } else {
        return new JSONArray();
    }
}

public void parseJSONArray(JSONArray array) throws Exception {

    for(int i = 0; i < array.length(); ++i) {
        JSONObject item1 = array.getJSONObject(i);


        LatLng location = new LatLng(item1.getDouble("latitude"), item1.getDouble("longitude"));



        mMap.addMarker(new MarkerOptions().position(location).title("Start"));

    }

}

4 个答案:

答案 0 :(得分:1)

为什么要在共享偏好设置中使用它?为什么不将它保存为序列化对象(列表),如this answer中所述。我相信latlng不是可序列化的(因为它是最终的),但你可以像这样类似的情况修复它:

public class TaxiRouteData implements Serializable{


private double startlat;
private double startlong;
private double endlat;
private double endlong;



public TaxiRouteData() {
}

public TaxiRouteData(LatLng startlocation, LatLng endlocation) {
    this.startlat = startlocation.latitude;
    this.startlong = startlocation.longitude;
    this.endlat = endlocation.latitude;
    this.endlong = endlocation.longitude;    }

public LatLng getStartlocation() {
    return  new LatLng(startlat,startlong);
}

public void setStartlocation(LatLng startlocation) {
    this.startlat = startlocation.latitude;
    this.startlong = startlocation.longitude;
}

public LatLng getEndlocation() {
    return  new LatLng(endlat,endlong);
}

public void setEndlocation(LatLng endlocation) {
    this.endlat = endlocation.latitude;
    this.endlong = endlocation.longitude;     }

这个类是可序列化的并且包含一些(在这种情况下只有2个,开始和结束)LatLng点,在类似的设置中你可以用它来序列化和保存LatLng的数组或列表,

答案 1 :(得分:1)

好的,所以我设法使用共享首选项,代码有点凌乱,我不知道它对设备的操作效率如何,但是这里去了

要存储我使用这两个类的多个路线

public void addToJSONArray(JSONArray array, LatLng item) throws Exception {

    JSONObject data = new JSONObject();
    data.put("latitude", item.latitude);
    data.put("longitude", item.longitude);

    array.put(data);


}

public void saveJourney(Context context, JSONArray saveData) {
    SharedPreferences storeAllRoutes = context.getSharedPreferences("STORED_ROUTES", context.MODE_PRIVATE);
    SharedPreferences numberOfRoutes = context.getSharedPreferences("NUM_ROUTES", context.MODE_PRIVATE);
    Editor editor = storeAllRoutes.edit();
    Editor numEdit = numberOfRoutes.edit();


        i = numberOfRoutes.getInt("numOfRoutes",0);
        editor.putString("saveData"+i,saveData.toString());
        i++;
        numEdit.putInt("numOfRoutes",i);
        editor.commit();
        numEdit.commit();
        Toast.makeText(getApplicationContext(), "Journey Saved",
                Toast.LENGTH_SHORT).show();

}

然后检索我使用的数据

public JSONArray getData(Context context, int i) throws Exception {
    SharedPreferences storeAllRoutes = context.getSharedPreferences("STORED_ROUTES", context.MODE_PRIVATE);
    SharedPreferences numberOfRoutes = context.getSharedPreferences("NUM_ROUTES", context.MODE_PRIVATE);


    if (numberOfRoutes.contains("numOfRoutes")&&i>0) {


            return new JSONArray(storeAllRoutes.getString("saveData" + i, ""));


    } else {


        return new JSONArray();
    }

}


public void parseJSONArray(JSONArray array) throws Exception {

    for (int i = 0; i < array.length(); ++i) {
        JSONObject item1 = array.getJSONObject(i);


        LatLng location = new LatLng(item1.getDouble("latitude"), item1.getDouble("longitude"));


        mMap.addMarker(new MarkerOptions().position(location).title("Start"));

    }

}

我使用:

在onCreate方法中调用retrieve方法
SharedPreferences numberOfRoutes = this.getSharedPreferences("NUM_ROUTES", this.MODE_PRIVATE);

    try {
        if (numberOfRoutes.contains("numOfRoutes")&&numberOfRoutes.getInt("numOfRoutes",0)>0) {
            for(int i = 1;i<numberOfRoutes.getInt("numOfRoutes",0)+1;i++ )
            {
                allRoutes = getData(this,i);
                parseJSONArray(allRoutes);
            }

        }
        else{
            Toast.makeText(getApplicationContext(), "No routes exist",
                    Toast.LENGTH_SHORT).show();

        }

    } catch (Exception e) {
        e.printStackTrace();
    }

答案 2 :(得分:0)

您可以使用Sqlite数据库,而不是使用首选项。但是如果你坚持使用SharedPreferences,那么我认为你没有太多选择,因为你只能存储boolean,float,int,long,String或StringSet。我看到的唯一可能的方法是使用您自己的分隔符连接所有值。

答案 3 :(得分:0)

您也可以使用JSON格式。只需将您的集合解析为JSON格式的字符串,将此字符串保存在首选项中。

但一般来说,我建议使用SQLIte。为你管理你的合作会更容易。