【问题标题】:Android Shared preferences - Array list of classAndroid 共享首选项 - 类的数组列表
【发布时间】:2023-03-07 17:23:01
【问题描述】:

我有一个 Player 类,它有一个名称和一个分数数组列表。使用按钮动态添加分数。我想使用共享首选项来保存我在主要活动中创建的Arraylist<Player> players。我尝试了几种解决方案,但均未成功。

到目前为止我尝试了什么:

链接: Save ArrayList to SharedPreferences

当我使用 ObjectSerializer 类时,我无法导入包 org.apache.pig.impl.util;这会导致出现错误,例如:

因为 WrappedIOException 在那个包中。

Tinydb: Tiny db 似乎是一个很好的解决方案,但是当我检索数据时出现错误。这些是我从 java 文件中更改的方法:

    public void putListObject(String key, ArrayList<Player> playerArray){
        checkForNullKey(key);
        Gson gson = new Gson();
        ArrayList<String> playerStrings = new ArrayList<String>();
        for(Player player : playerArray){
            playerStrings.add(gson.toJson(player));
        }
        putListString(key, playerStrings);
    }

    public ArrayList<Player> getListObject(String key, Class<?> mClass) {
        Gson gson = new Gson();

        ArrayList<String> objStrings = getListString(key);
        ArrayList<Player> objects = new ArrayList<Player>();

        for (String jObjString : objStrings) {
            Object value = gson.fromJson(jObjString, mClass);
            objects.add((Player) value);
        }
        return objects;
    }

public void putListObject(String key, ArrayList<Player> playerArray){
    checkForNullKey(key);
    Gson gson = new Gson();
    ArrayList<String> playerStrings = new ArrayList<String>();
    for(Player player : playerArray){
        playerStrings.add(gson.toJson(player));
    }
    putListString(key, playerStrings);
}

玩家类:

public class Player implements Serializable {
    private String name;
    private ArrayList<Integer> scores = new ArrayList<>();

    public Player(String name){
        this.name = name;
    }


    public ArrayList<Integer> getScores() {
        return scores;
    }

    public void setScore(int score) {
        scores.add(score);
    }

如果有人对如何存储和检索我的播放器数组列表有好的解决方案,请分享

【问题讨论】:

  • 在你的 serialize 方法中去掉红线代码......你也不需要返回任何东西,所以你也可以去掉它。
  • 我没有使用 tinyDb,但如果你能展示你使用它时遇到的错误,那么有人更有可能帮助你。从长远来看,将这些信息存储在数据库中可能是您​​最好的解决方案。
  • 最简单的解决方案是使用 sqlite 数据库。在共享偏好上存储大数据并不是一个好主意.....

标签: java android class arraylist sharedpreferences


【解决方案1】:

在保存到共享首选项之前,请尝试将您的对象转换为 JSON。 GSON 是一个快速易用的工具。

【讨论】:

  • 你能举个例子吗,我试过GSON但​​没有成功
【解决方案2】:

我的一个项目中有类似的要求,我可以在 GSON 的帮助下完成。检查下面的示例代码。

   /**
     * Remove preference value.
     *
     * @param mContext The context to use.  Usually your {@link android.app.Application}
     *                 or {@link Activity} object.
     * @param key      The name of the preference to put.
     * <br><br>
     * @return Returns true if preference value were successfully removed from
     * persistent storage.
     */
    public static <E>boolean putList(Context mContext, String key, List<E> objectList){
        return SharedPreferenceUtils.putString(mContext, key, new Gson().toJson(objectList));
    }

    /**
     * Remove preference value.
     *
     * @param mContext The context to use.  Usually your {@link android.app.Application}
     *                 or {@link Activity} object.
     * @param key          The name of the preference.
     * <br><br>
     * @return Returns true if preference value were successfully removed from
     * persistent storage.
     */
    public static <E>List<E> getList(Context mContext, String key){
        TypeToken<List<E>> token = new TypeToken<List<E>>() {};
        String json = SharedPreferenceUtils.getString(mContext, key, null);
        List<E> objectList = new Gson().fromJson(json, token.getType());
        return objectList;
    }

例子:

List<Player> list = new ArrayList<Player>();
list.add(player);
putList(this, "j", list);//Store List to SharedPreference

list = getList(this, "j");//Get List from SharedPreference
Log.e("DATA", list.toString());

有关SharedPreferenceUtils 的完整源代码,请查看link

【讨论】:

    猜你喜欢
    • 2012-12-14
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多