当前位置: 首页 > 知识库问答 >
问题:

将ArrayList的多个实例存储到共享首选项

贝浩歌
2023-03-14

目前我有一个应用程序跟踪用户的位置,并通过使用折线和地图标记绘制路线,我需要将包含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"));

    }

}

共有1个答案

程毅
2023-03-14

为什么要将其放在共享首选项中?为什么不将其保存为序列化对象的(列表),如本答案所述。我认为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的数组或列表,

 类似资料:
  • 我正在尝试将Firebase DataSnapshot对象保存到SharedReferences。 请看这篇文章,我在其中设计了一种方法来实现这一点。 ... 到目前为止,我已经尝试了: > 使用Gson。Json方法。结果:似乎不起作用。。。我不认为DataSnapshot类是“POJO”类型的类。。。至少没有一个能与gson合作。 使用此方法: 私有静态字符串toString(可序列化o)引发

  • 我在共享首选项中保存列表并将其显示在列表视图中没有问题,但我的问题是当我重新启动应用程序并尝试将项目添加到列表视图时 旧的存储项目已删除.有我的代码: } public void getDates(){

  • 对于下面的代码,我正在尝试检索共享的首选项,我认为它保存正确,但当我回到登录屏幕时,所有的数据都消失了。我需要它留在我回到这个屏幕上。所以我在个人资料页面上输入姓名、年龄和id到三个单独的行中。然后按下save按钮,然后按下action Bar上的back转到前面的页面。当我回到个人资料页面时,我的信息应该还在那里,但它没有任何帮助?

  • 非常感谢您的光临,我正在为学校开发一个应用程序,我遇到了另一个问题。该应用程序的主要思想是跟踪您的卡路里,我希望它能节省卡路里,所以当应用程序关闭时,它仍然会记住他们。我已经忙了一段时间了,现在尝试使用SavedPreferences,但我总是出现错误。我希望有人能帮我。 } 我可能做了很多明显的愚蠢的事情,但我真的弄不明白。 多谢!

  • 我正在向SharedPreference添加一个集合。这是来自另一个类的静态集,该类处理一些数据并将其存储在该集中。 然后我转到另一个活动(订单活动),在那里我显示了这组信息。第一次访问共享偏好时,我能够获得正确的详细信息。例如name1、name2、name3。 然后,我离开此活动,返回到另一个活动,添加另一个名称,然后再次返回到此 Order 活动。我希望这次得到名称1,名称2,名称3,名称4

  • 更新崩溃日志: