简体   繁体   English

Android Shared Preference TinyDB putListObject 函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM