我正在尝试使用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>)
非常感谢帮助!
虽然任何实例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)
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)