2016-01-30 5 views
6

Ich versuche, eine Objektliste zu den freigegebenen Einstellungen mit TinyDB putListObject Funktion zu speichern, aber ich bekomme einen Wrong 2nd argument type Fehler. Ich kann die putObject Funktion gut verwenden, der Fehler erscheint nur, wenn ich die putListObject Funktion verwende.Android gemeinsame Präferenz TinyDB putListObject-Funktion


Spielerklasse:

public class Player { 

    private String name = ""; 
    private int score = 0; 

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

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public int getScore() { 
     return score; 
    } 

    public void setScore(int score) { 
     this.score = score; 
    } 
} 

putListObject Funktion:

public void putListObject(String key, ArrayList<Object> objArray){ 
     checkForNullKey(key); 
     Gson gson = new Gson(); 
     ArrayList<String> objStrings = new ArrayList<String>(); 
     for(Object obj : objArray){ 
      objStrings.add(gson.toJson(obj)); 
     } 
     putListString(key, objStrings); 
    } 

Wie kann ich die Funktion:

ArrayList<Player> playerList = new ArrayList<Player>(); 

TinyDB tinydb = new TinyDB(this); 
tinydb.putListObject("players", playerList); 

Der Fehler, den ich bekam:

putListObject (String java.util.ArrayList <java.lang.Object>) in TinyDB kann nicht auf (String java.util.ArrayList <com.example.package.Player>)

angewendet werden

Hilfe wäre sehr willkommen!

Antwort

6

Obwohl jede Instanz von Player eine Object ist, ist ein ArrayList von Players nicht dasselbe wie ein ArrayList von Objects. Ändern Sie Ihre Methodensignatur:

putListObject(String key, ArrayList<Player> objArray) 

und for-Schleife:

for(Player player : objArray){ 
    objStrings.add(gson.toJson(player)); 
} 
2

kcochibili Entwickler von TinyDB beantwortet diese auf GitHub. Er sagt, Sie müssen Ihre benutzerdefinierten Objekte auf Objekt vor Trigger putListObject zu werfen.

Eine Probe für die Umsetzung benutzerdefinierten Objekt Arraylist:

ArrayList<Player> players = new ArrayList<Player>(); 
ArrayList<Object> playerObjects = new ArrayList<Object>(); 

for(Player a : players){ 
    playerObjects.add((Object)a); 
} 

TinyDB tinydb = new TinyDB(this); 
tinydb.putListObject("players", playerObjects); 

Auch wenn Sie Werte von DB erhalten wollen wird es geben Arraylist < Objekt>. Daher möchten Sie sie möglicherweise auf Ihr benutzerdefiniertes Objekt zurückwerfen.

Eine Probe hierfür:

TinyDB tinydb = new TinyDB(this); 
ArrayList<Object> playerObjects = tinydb.getListObject("players", Player.class); 
ArrayList<Player> players = new ArrayList<Player>(); 

for(Object objs : playerObjects){ 
    players.add((Player)objs); 
} 

können Sie alle Objekte individuelle Verwendung durch Gießen. Die andere Möglichkeit, die ich bevorzuge ist, Hinzufügen und setzen Methoden für alle benutzerdefinierten Objekte zu TinyDB-Klasse. Zum Beispiel:

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

//No need Class<?> mClass parameter. Because we know it is Player! 
public ArrayList<Player> getListPlayer(String key){ 
    Gson gson = new Gson(); 

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

    for(String jObjString : objStrings){ 
     Player player = gson.fromJson(jObjString, Player.class); 
     playerList.add(value); 
    } 
    return playerList; 
} 
Verwandte Themen