首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android共享偏好TinyDB putListObject函数

Android共享偏好TinyDB putListObject函数
EN

Stack Overflow用户
提问于 2016-01-30 11:52:32
回答 2查看 9.4K关注 0票数 9

我试图使用TinyDB的putListObject函数将一个对象列表保存到共享首选项中,但我得到了一个Wrong 2nd argument type错误。我可以很好地使用putObject函数,只有使用putListObject函数时才会出现错误。

玩家级别:

代码语言:javascript
复制
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函数:

代码语言:javascript
复制
 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);
    }

我如何使用这个函数:

代码语言:javascript
复制
ArrayList<Player> playerList = new ArrayList<Player>();

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

我所犯的错误:

不能将java.util.ArrayList)中的putListObject (String java.util.ArrayList)应用于(String java.util.ArrayList)

我会非常感谢你的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-11 07:49:10

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

用于放置自定义对象ArrayList的示例:

代码语言:javascript
复制
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< Object >。因此,您可能需要将它们转换回自定义对象。

这方面的样本如下:

代码语言:javascript
复制
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类中。例如:

代码语言:javascript
复制
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;
}
票数 13
EN

Stack Overflow用户

发布于 2016-01-30 12:16:22

尽管Player的任何实例都是Object,但播放器的ArrayList与对象的ArrayList并不相同。将方法签名更改为:

代码语言:javascript
复制
putListObject(String key, ArrayList<Player> objArray)

以及循环:

代码语言:javascript
复制
for(Player player : objArray){
   objStrings.add(gson.toJson(player));
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35101437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档