[英]Android Shared Preference TinyDB putListObject function
I'm trying to save an object list to the Shared Preferences using TinyDB's putListObject
function, but I'm getting a Wrong 2nd argument type
error.我正在尝试使用 TinyDB 的putListObject
函数将对象列表保存到共享首选项,但我收到了Wrong 2nd argument type
错误。 I can use the putObject
function just fine, the error only appears when I use the putListObject
function.我可以很好地使用putObject
函数,只有在使用putListObject
函数时才会出现错误。
Player Class:玩家等级:
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 function: 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);
}
How I used the function:我如何使用该功能:
ArrayList<Player> playerList = new ArrayList<Player>();
TinyDB tinydb = new TinyDB(this);
tinydb.putListObject("players", playerList);
The error I got:我得到的错误:
putListObject (String java.util.ArrayList<java.lang.Object>) in TinyDB cannot be applied to (String java.util.ArrayList<com.example.package.Player>) TinyDB 中的 putListObject (String java.util.ArrayList<java.lang.Object>) 无法应用于 (String java.util.ArrayList<com.example.package.Player>)
Help would be much appreciated!帮助将不胜感激!
kcochibili Developer of TinyDB answered this on github. TinyDB 的 kcochibili 开发人员在 github 上回答了这个问题。 He says, you must cast your custom objects to object before trigger putListObject.他说,您必须在触发 putListObject 之前将自定义对象转换为对象。
A sample for putting Custom Object ArrayList:放置自定义对象 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);
Also when you want to get values from DB it will give ArrayList< Object >.此外,当您想从 DB 中获取值时,它会给出 ArrayList<Object>。 So you may want to cast them back to your custom object.因此,您可能希望将它们转换回您的自定义对象。
A sample for this:一个示例:
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);
}
You can use all custom objects by casting.您可以通过强制转换使用所有自定义对象。 The other way i prefer is, adding get and put methods for all custom objects to TinyDB Class.我更喜欢的另一种方法是将所有自定义对象的 get 和 put 方法添加到 TinyDB 类。 For example :例如 :
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(player);
}
return playerList;
}
Although any instance of Player
is an Object
, an ArrayList
of Players is not the same as an ArrayList
of Objects.尽管Player
的任何实例都是Object
,但 Players 的ArrayList
与 Objects 的ArrayList
不同。 Change your method signature to :将您的方法签名更改为:
putListObject(String key, ArrayList<Player> objArray)
and for loop to:和for循环:
for(Player player : objArray){
objStrings.add(gson.toJson(player));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.