2015-05-08 6 views
1

В настоящее время у меня есть приложение, которое отслеживает местоположение пользователя и рисует маршрут, используя полилинии и маркеры карт. Мне нужно добавить arraylist, который содержит координаты LatLng, в другой список массивов, который хранит все маршрутов, , т. е. latlng arraylist - это один маршрут, поэтому мне нужно сохранить все маршруты в одном arraylist и сохранить его в общих предпочтениях, чтобы я мог загружать все маршруты, которые пользователь взял на карту. То, что я до сих пор хранит только один маршрут для общих настроек и перезаписывает его каждый раз, когда добавляется новый маршрут.Хранение нескольких экземпляров Arraylist <LatLng> для общих настроек

Вот что я до сих пор эти 2 класса сохранить 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(); 

} 

и эти 2 классов получить данные

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")); 

    } 

} 
+0

возможно дубликат [Как сохранить ArrayList с SharedPreferences] (http://stackoverflow.com/questions/23511821/how-to-save-an-arraylistlatlng-with-sharedpreferences) – Kunu

+0

@Kunu, что ответ описывает, как сохранить одного arraylist, я смотрю на сохранение нескольких массивов, которые могут быть извлечено – MichaelStoddart

+0

Вы можете использовать конкатенацию String с помощью специального символа в соответствии с вашим требованием и извлечь его, когда вам это нужно. – Kunu

ответ

1

Хорошо, поэтому мне удалось это сделать, используя общие настройки, код немного грязный, и я не знаю, насколько это неэффективно для но здесь идет

Для хранения нескольких маршрутов я использую эти 2 класса

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 с помощью:

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(); 
    } 
0

Вместо использования предпочтений вы можете использовать SQLite базы данных. Но если вы настаиваете на использовании SharedPreferences, я не думаю, что у вас есть выбор, так как вы можете хранить только логические, float, int, long, String или StringSet. Единственный возможный способ, который я вижу, - это объединить все значения с помощью собственного разделителя.

0

Вы также можете использовать формат JSON. Просто проанализируйте свою коллекцию в форматированной строке JSON, сохраните эту строку в настройках.

Но, вообще говоря, я бы предложил использовать SQLIte. Было бы проще управлять вашим сотрудничеством для вас.

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,

+0

Я все еще довольно новичок в настройках Android и общих предпочтениях - это метод, знакомый для хранения данных, когда пользователь не использует приложение, которое можно легко получить, когда пользователь вернется в приложение, будет ли этот метод позволять мне это делать? – MichaelStoddart

+1

Сериализованный класс позволяет сохранить (состояние) класс в памяти.Внедряя методы из ответа в ссылке, вы можете сохранить и получить его. Например, если вы используете эти методы в onStart, вы можете загружать данные, которые вы ранее сохраняли, когда запускается ваша активность. Большим преимуществом является то, что вы сохраняете пользовательские объекты или списки из них довольно легко. Также смотрите здесь: http://developer.android.com/reference/java/io/Serializable.html – Jasper

+0

Спасибо за ваш ответ, я соглашусь с этим как ответом, как только я попытаюсь найти решение для себя – MichaelStoddart

Смежные вопросы