【问题标题】:Android Shared Preference TinyDB putListObject frunctionAndroid Shared Preference TinyDB 获取 List Object 功能
【发布时间】:2016-05-08 04:28:57
【问题描述】:

我正在尝试使用 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;
    }
}

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);
    }

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

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

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

我得到的错误:

TinyDB 中的

putListObject (String java.util.ArrayList) 不能应用于(字符串 java.util.ArrayList)


我们将不胜感激!

【问题讨论】:

    标签: java android


    【解决方案1】:

    kcochibili TinyDB 的开发者在 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);
    

    此外,当您想从 DB 中获取值时,它会给出 ArrayList。因此,您可能希望将它们转换回您的自定义对象。

    一个示例:

    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);
    }
    

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

    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;
    }
    

    【讨论】:

    • Faith K,我知道“谢谢”已经过时且不受欢迎,但你为我节省了几个小时的工作时间,我想表达的不仅仅是简单的赞成票!然而,一个完整的工作示例在向其他人解释它时会有很长的路要走。
    • 如果我多次使用同一个键调用putListPlayer会发生什么?它会继续更新该键的值还是会抛出错误?
    • 嗨@Faith K 谢谢。我已将您的第二种方式用于我的自定义数组列表存储。
    • @RavishJha 再次致电putListPlayer。或任何 TinyDB 函数将更新上次使用指定键保存的值。
    【解决方案2】:

    尽管Player 的任何实例都是Object,但玩家的ArrayList 与对象的ArrayList 不同。将您的方法签名更改为:

    putListObject(String key, ArrayList<Player> objArray)
    

    for 循环到:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-21
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      相关资源
      最近更新 更多