2015-01-23 15 views
20

Mam listę produktów, które pobieram z serwisu internetowego, kiedy aplikacja jest otwierana po raz pierwszy, aplikacja pobiera listę produktów z usługi internetowej. Chcę zapisać tę listę we wspólnych preferencjach.Jak zapisać listę <Object> w SharedPreferences?

List<Product> medicineList = new ArrayList<Product>(); 

gdzie klasa Produkt:

public class Product { 
    public final String productName; 
    public final String price; 
    public final String content; 
    public final String imageUrl; 

    public Product(String productName, String price, String content, String imageUrl) { 
     this.productName = productName; 
     this.price = price; 
     this.content = content; 
     this.imageUrl = imageUrl; 
    } 
} 

jak mogę zapisać Ta lista nie wzywającą od usługa za każdym razem?

+1

można jedynie zapisać wartości prymitywnych do SharedPrefrences. –

Odpowiedz

18

Można używać tylko typów pierwotnych, ponieważ preferencja pozostaje w pamięci. Ale to, co można użyć jest szeregować swoje typy z Gson do json i umieścić napis na preferencje:

private static SharedPreferences sharedPreferences = context.getSharedPreferences(STORE_FILE_NAME, Context.MODE_PRIVATE); 

private static SharedPreferences.Editor editor = sharedPreferences.edit(); 

public <T> void setList(String key, List<T> list) { 
    Gson gson = new Gson(); 
    String json = gson.toJson(list); 

    set(key, json); 
} 

public static void set(String key, String value) { 
    editor.putString(key, value); 
    editor.commit(); 
} 
+0

hej wiem, że to naprawdę późno, ale dlaczego używasz zmiennych statycznych i metod? –

+4

Podstępem jest jak go odzyskać?! –

+0

@albertkim Uważam, że dzieje się tak dlatego, że nie potrzebuje nowych instancji SharedPreferences za każdym razem, gdy tego potrzebuje. Trzymał zmienną schowaną gdzieś na później. –

2

Aktualnie masz dwie opcje
a) stosowanie SharedPreferences
b) używać SQLite i zapisać wartości w tym.

Jak wykonać
a) SharedPreferences
najpierw zapisać swoją listę jako komplet, a następnie przekształcić go z powrotem do listy podczas odczytu z SharedPreferences.

Listtasks = new ArrayList<String>(); 
Set<String> tasksSet = new HashSet<String>(Listtasks); 
PreferenceManager.getDefaultSharedPreferences(context) 
    .edit() 
    .putStringSet("tasks_set", tasksSet) 
    .commit(); 

Wtedy, kiedy ją przeczytać:

Set<String> tasksSet = PreferenceManager.getDefaultSharedPreferences(context) 
    .getStringSet("tasks_set", new HashSet<String>()); 
List<String> tasksList = new ArrayList<String>(tasksSet); 

b) SQLite Dobry poradnik: http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/

1

W SharedPreferences można przechowywać tylko prymitywów.

Jednym z możliwych podejść jest to, że możesz używać GSON i zapisywać wartości w preferencjach w JSON.

Gson gson = new Gson(); 
String json = gson.toJson(medicineList); 

yourPrefereces.putString("listOfProducts", json); 
yourPrefereces.commit(); 
0

Można to zrobić za pomocą Gson jak poniżej:

  • Pobierz List<Product> od usługa
  • przekonwertować List do JsonString przy użyciu new Gson().toJson(medicineList, new TypeToken<List<Product>>(){}.getType())
  • Zapisz skonwertowany ciąg na SharePreferences jak ty normalnie

W celu odtworzenia swoją List, trzeba cofnąć ten proces używając fromJson metody dostępne w Gson.

13

Możesz użyć GSON do konwersji Object -> JSON (.toJSON) i JSON -> Object (.fromJSON).

  • Określ swoje tagi ze chcesz (na przykład):

    private static final String PREFS_TAG = "SharedPrefs"; 
    private static final String PRODUCT_TAG = "MyProduct"; 
    
  • Pobierz sharedPreference z tymi tagu

    private List<Product> getDataFromSharedPreferences(){ 
        Gson gson = new Gson(); 
        List<Product> productFromShared = new ArrayList<>(); 
        SharedPreferences sharedPref = getApplicationContext().getSharedPreferences(PREFS_TAG, Context.MODE_PRIVATE); 
        String jsonPreferences = sharedPref.getString(PRODUCT_TAG, "");  
    
        Type type = new TypeToken<List<Product>>() {}.getType(); 
        productFromShared = gson.fromJson(jsonPreferences, type); 
    
        return preferences; 
    } 
    
  • Określ sharedPreferences

    private void setDataFromSharedPreferences(Product curProduct){ 
        Gson gson = new Gson(); 
        String jsonCurProduct = gson.toJson(curProduct); 
    
        SharedPreferences sharedPref = getApplicationContext().getSharedPreferences(PREFS_TAG, Context.MODE_PRIVATE); 
        SharedPreferences.Editor editor = sharedPref.edit(); 
    
        editor.putString(PRODUCT_TAG, jsonCurProduct); 
        editor.commit(); 
    } 
    
  • Jeśli chcesz zapisać tablicę produktów. Można to zrobić:

    private void addInJSONArray(Product productToAdd){ 
    
        Gson gson = new Gson(); 
        SharedPreferences sharedPref = getApplicationContext().getSharedPreferences(PREFS_TAG, Context.MODE_PRIVATE); 
    
        String jsonSaved = sharedPref.getString(PRODUCT_TAG, ""); 
        String jsonNewproductToAdd = gson.toJson(productToAdd); 
    
        JSONArray jsonArrayProduct= new JSONArray(); 
    
        try { 
         if(jsonSaved.length()!=0){ 
          jsonArrayProduct = new JSONArray(jsonSaved); 
         } 
         jsonArrayProduct.put(new JSONObject(jsonNewproductToAdd)); 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
    
        //SAVE NEW ARRAY 
        SharedPreferences.Editor editor = sharedPref.edit(); 
        editor.putString(PRODUCT_TAG, jsonArrayProduct); 
        editor.commit(); 
    } 
    
+1

Jaki jest kod do pobrania tablicy produktów z JSONArray? –

+1

Nie można umieścić json bezpośrednio w SharedPreference tak, jak próbowałeś z tą linią: 'editor.putString (PRODUCT_TAG, jsonArrayProduct);' Musisz najpierw przekonwertować go na ciąg (być może z obiektem Gson w kodzie) . Na przykład: 'gson.toJson (jsonArrayProduct)' –

+0

Otrzymuję Oczekiwany BEGIN_ARRAY ale BEGIN_OBJECT na linii 1 kolumna 2 ścieżka $ przy otrzymaniu obiektów –

2

Wszystko odpowiedź JSON związane są OK, ale pamiętaj, Java pozwala szeregować dowolny obiekt, jeśli zaimplementować interfejs java.io.Serializable. W ten sposób można zapisać go również w preferencjach jako obiekt serializowany. Oto przykład przechowywania jako Preferencje: https://gist.github.com/walterpalladino/4f5509cbc8fc3ecf1497f05e37675111 Mam nadzieję, że to może ci pomóc jako opcja.

2
SharedPreferences mPrefs = getPreferences(MODE_PRIVATE); 

Aby zapisać

Editor prefsEditor = mPrefs.edit(); 
Gson gson = new Gson(); 
String json = gson.toJson(myObject); 
prefsEditor.putString("MyObject", json); 
prefsEditor.commit(); 

Aby uzyskać

Gson gson = new Gson(); 
String json = mPrefs.getString("MyObject", ""); 
MyObject obj = gson.fromJson(json, MyObject.class); 
+0

pytanie już zostało odebrane i zaakceptowane, dlaczego dodajesz duplikat odpowiedzi? – kakajan

Powiązane problemy