2015-01-23 15 views
20

Ich habe eine Liste von Produkten, die ich vom Webservice abrufe, wenn die App zum ersten Mal geöffnet wird, ruft die App die Produktliste vom Webservice ab. Ich möchte diese Liste in den gemeinsamen Einstellungen speichern.Wie speichere ich die Liste <Object> in SharedPreferences?

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

wo Produktklasse ist:

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; 
    } 
} 

, wie ich diese Liste speichern kann nicht von webservice jedes Mal anfordert?

+1

Sie nur primitive Werte SharedPrefrences speichern. –

Antwort

18

Es ist nur möglich, primitive Typen zu verwenden, weil die Präferenzen im Speicher bleiben. Aber was können Sie verwenden, ist Ihre Typen mit Gson in Json serialisiert und String in Präferenzen setzen:

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

Hey ich weiß, das ist wirklich spät, aber warum verwenden Sie statische Variablen und Methoden? –

+4

Trick ist, wie man es zurückbekommt! –

+0

@albertkim Ich glaube, das ist so, weil er nicht jedesmal neue Instanzen von SharedPreferences braucht, wenn er sie braucht. Er hielt eine Variable irgendwo für den späteren Gebrauch versteckt. –

2

Sie haben zur Zeit zwei Möglichkeiten
a) Verwendung SharedPreferences
b) Verwendung SQLite und Werte, dass speichern.

Wie
a) SharedPreferences
Zuerst speichern Sie Ihre Liste als Set, auszuführen und sie dann in eine Liste konvertieren zurück, wenn Sie von SharedPreferences lesen.

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

Dann, wenn Sie es lesen:

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

b) SQLite Ein gutes Tutorial: http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/

1

In SharedPreferences können Sie nur Primitive speichern.

Ein möglicher Ansatz besteht darin, dass Sie GSON verwenden und Werte in Voreinstellungen in JSON speichern können.

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

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

Sie es tun können Gson wie unten:

  • Herunterladen List<Product> von webservice
  • Konvertieren der List in JsonStringnew Gson().toJson(medicineList, new TypeToken<List<Product>>(){}.getType())
  • Speichern Sie die konvertierte Zeichenkette inmitwie Sie normalerweise

Um Ihre List zu rekonstruieren, müssen Sie den Prozess fromJson Methode in Gson verfügbar zurückzukehren.

13

Mit GSON können Sie Objekt -> JSON (.toJSON) und JSON -> Objekt (.fromJSON) konvertieren.

  • Definieren Sie Ihre Schlagworte mit Ihnen wollen (zum Beispiel):

    private static final String PREFS_TAG = "SharedPrefs"; 
    private static final String PRODUCT_TAG = "MyProduct"; 
    
  • Ihre sharedPreference erhalten Zugriff auf diese

    des Tags
    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; 
    } 
    
  • Stellen Sie Ihren 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(); 
    } 
    
  • Wenn Sie eine Reihe von Produkten speichern möchten. Sie tun dies:

    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

Wie lautet der Code zum Abrufen des Array von Produkten aus dem JSONArray? –

+1

Sie können json nicht direkt in SharedPreference einfügen, wie Sie es mit dieser Zeile versucht haben: 'editor.putString (PRODUCT_TAG, jsonArrayProduct);' Sie müssen es zuerst in eine Zeichenfolge konvertieren (möglicherweise mit dem Gson-Objekt in Ihrem Code) . Zum Beispiel: 'gson.toJson (jsonArrayProduct)' –

+0

Ich erhalte Erwartet BEGIN_ARRAY aber war BEGIN_OBJECT in Zeile 1 Spalte 2 Pfad $, wenn die Objekte –

2

die Antwort auf JSON Zusammenhang Alle sind Ok aber nicht vergessen, Java Sie jedes Objekt serialisiert werden können, wenn Sie die java.io.Serializable-Schnittstelle implementieren. Auf diese Weise können Sie sie auch als serialisiertes Objekt in den Voreinstellungen speichern. Hier ist ein Beispiel für die Speicherung als Einstellungen: https://gist.github.com/walterpalladino/4f5509cbc8fc3ecf1497f05e37675111 Ich hoffe, dass dies Ihnen als eine Option helfen könnte.

2
SharedPreferences mPrefs = getPreferences(MODE_PRIVATE); 

Für

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

speichern Für bekommen

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

Frage bereits beantwortet und akzeptiert bekommen, warum das Hinzufügen Sie doppelte Antwort? – kakajan

Verwandte Themen