Android共享首选项TinyDB putListObject frunction

use*_*354 8 java android

我正在尝试使用TinyDB的putListObject功能将对象列表保存到共享首选项,但是我收到了一个Wrong 2nd argument type错误.我可以正常使用该putObject功能,只有在我使用该putListObject功能时才会出现错误.


玩家类:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

putListObject函数:

 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);
    }
Run Code Online (Sandbox Code Playgroud)

我是如何使用这个功能的:

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

TinyDB tinydb = new TinyDB(this);
tinydb.putListObject("players", playerList);
Run Code Online (Sandbox Code Playgroud)

我得到的错误:

TinyDB中的putListObject(String java.util.ArrayList <java.lang.Object>)无法应用于(String java.util.ArrayList <com.example.package.Player>)


非常感谢帮助!

Wür*_*paß 7

虽然任何实例Player都是一个Object,但是一个ArrayList玩家与一个ArrayList对象不同.将您的方法签名更改为:

putListObject(String key, ArrayList<Player> objArray)
Run Code Online (Sandbox Code Playgroud)

并循环到:

for(Player player : objArray){
   objStrings.add(gson.toJson(player));
}
Run Code Online (Sandbox Code Playgroud)


Fat*_* K. 7

TinyDB的kcochibili开发人员在github上回答了这个问题。他说,必须在触发putListObject之前将自定义对象转换为对象。

用于放置自定义对象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);
Run Code Online (Sandbox Code Playgroud)

同样,当您想从数据库中获取值时,它将给出ArrayList <Object>。因此,您可能需要将它们投射回您的自定义对象。

一个样本:

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);
}
Run Code Online (Sandbox Code Playgroud)

您可以通过强制转换使用所有自定义对象。我更喜欢的另一种方法是,将所有自定义对象的get和put方法添加到TinyDB Class中。例如 :

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;
}
Run Code Online (Sandbox Code Playgroud)

  • Faith K,我知道“谢谢”已经过时并且令人皱眉,但你节省了我几个小时的工作时间,我想表达更多的感激之情,而不仅仅是简单的投票!然而,一个完整的工作示例将有助于向其他人解释它。 (2认同)