2016-04-13 12 views
0

Ich habe Player-Klasse, die einen Namen und eine Arraylist von Partituren hat. Scores werden dynamisch mit einer Schaltfläche hinzugefügt. Ich möchte gemeinsame Einstellungen verwenden, um die Arraylist<Player> players zu speichern, die ich in meiner Hauptaktivität erstellt habe. Ich habe ein paar Lösungen ohne Erfolg ausprobiert.Android Shared Einstellungen - Array-Liste der Klasse

Was habe ich versucht, so weit:

Links: Save ArrayList to SharedPreferences

Als ich ObjectSerializer Klasse habe ich Importpaket org.apache.pig.impl.util kippe; und dies bewirkt, dass Fehler wie bekommen:

enter image description here

weil WrappedIOException in diesem Paket ist.

Tinydb: Tiny db schien eine gute Lösung gemocht, aber ich bekomme Fehler, wenn ich meine Daten abrufen. Dies sind die Methoden, die ich aus der Java-Datei geändert:

public void putListObject(String key, ArrayList<Player> playerArray){ 
     checkForNullKey(key); 
     Gson gson = new Gson(); 
     ArrayList<String> playerStrings = new ArrayList<String>(); 
     for(Player player : playerArray){ 
      playerStrings.add(gson.toJson(player)); 
     } 
     putListString(key, playerStrings); 
    } 

    public ArrayList<Player> getListObject(String key, Class<?> mClass) { 
     Gson gson = new Gson(); 

     ArrayList<String> objStrings = getListString(key); 
     ArrayList<Player> objects = new ArrayList<Player>(); 

     for (String jObjString : objStrings) { 
      Object value = gson.fromJson(jObjString, mClass); 
      objects.add((Player) value); 
     } 
     return objects; 
    } 

public void putListObject(String key, ArrayList<Player> playerArray){ 
    checkForNullKey(key); 
    Gson gson = new Gson(); 
    ArrayList<String> playerStrings = new ArrayList<String>(); 
    for(Player player : playerArray){ 
     playerStrings.add(gson.toJson(player)); 
    } 
    putListString(key, playerStrings); 
} 

Spielerklasse:

public class Player implements Serializable { 
    private String name; 
    private ArrayList<Integer> scores = new ArrayList<>(); 

    public Player(String name){ 
     this.name = name; 
    } 


    public ArrayList<Integer> getScores() { 
     return scores; 
    } 

    public void setScore(int score) { 
     scores.add(score); 
    } 

Wenn jemand eine gute Lösung haben, wie zu speichern und retrive meine Spieler Arraylist bitte teilen

+0

In Ihrer 'serialize' Methode entfernen Sie den roten linierten Code ... und Sie müssen auch wirklich nichts zurückgeben, damit Sie das auch loswerden können. – 3kings

+0

Ich habe tinyDb nicht verwendet, aber wenn Sie die Fehler, die Sie damit haben, zeigen können, dann kann Ihnen wahrscheinlich jemand helfen. Das Speichern dieser Informationen in einer Datenbank wird wahrscheinlich auf lange Sicht die beste Lösung sein. – codeMagic

+0

Die einfachste Lösung ist die Verwendung einer SQLite-Datenbank. große Daten auf gemeinsamen Vorlieben zu speichern ist nicht sehr gute Idee ..... – Opiatefuchs

Antwort

1

Versuchen Sie, Ihre Objekte in JSON zu konvertieren, bevor Sie sie in den gemeinsamen Einstellungen speichern. GSON ist ein schnelles, einfach zu bedienendes Tool dafür.

+0

können Sie ein Beispiel zeigen, habe ich versucht GSON aber keinen Erfolg – CookieMonster

0

Ich habe ähnliche Anforderungen in einem meiner Projekte, und ich kann es mit Hilfe von GSON tun. Überprüfen Sie den folgenden Beispielcode.

/** 
    * Remove preference value. 
    * 
    * @param mContext The context to use. Usually your {@link android.app.Application} 
    *     or {@link Activity} object. 
    * @param key  The name of the preference to put. 
    * <br><br> 
    * @return Returns true if preference value were successfully removed from 
    * persistent storage. 
    */ 
    public static <E>boolean putList(Context mContext, String key, List<E> objectList){ 
     return SharedPreferenceUtils.putString(mContext, key, new Gson().toJson(objectList)); 
    } 

    /** 
    * Remove preference value. 
    * 
    * @param mContext The context to use. Usually your {@link android.app.Application} 
    *     or {@link Activity} object. 
    * @param key   The name of the preference. 
    * <br><br> 
    * @return Returns true if preference value were successfully removed from 
    * persistent storage. 
    */ 
    public static <E>List<E> getList(Context mContext, String key){ 
     TypeToken<List<E>> token = new TypeToken<List<E>>() {}; 
     String json = SharedPreferenceUtils.getString(mContext, key, null); 
     List<E> objectList = new Gson().fromJson(json, token.getType()); 
     return objectList; 
    } 

Beispiel:

List<Player> list = new ArrayList<Player>(); 
list.add(player); 
putList(this, "j", list);//Store List to SharedPreference 

list = getList(this, "j");//Get List from SharedPreference 
Log.e("DATA", list.toString()); 

Für vollständige Quellcode SharedPreferenceUtils Kontrolle dieser link.