使用GSON在Sharedpreferences中存储对象。你怎么看?

时间:2013-04-05 18:15:30

标签: android object sharedpreferences gson

在使用应用程序对象后,我有一个(新的?)想法,使用GSON Libary和Sharedpreferences在活动之间交换数据。这具有很大的优势,即如果应用程序关闭,对象不会被破坏。

我想知道你的想法

  1. 安全
  2. 性能自动
  3. App稳定性
  4. 这是我的工作。首先创建一个MyExchanger类

     public class MyExchanger {
        //store your variables here
         String name;
         List<Vokabel> vokabeliste;
    
     //put your GETTERS und SETTERS HERE (or make them public)
    
    }
    

    然后是魔术发生的辅助类

    public class ExchangerUtils {
    
            Context context;
            SharedPreferences prefs;
            SharedPreferences.Editor editor;
            Resources res;
            Gson gson;
            Type type ;
    
    
            public ExchangerUtils(Context context) {
    
                    this.context = context;
                    prefs = PreferenceManager.getDefaultSharedPreferences(context
                                    .getApplicationContext());
                    res = context.getResources();
                    type = new TypeToken<MyExchanger>() {
                    }.getType();
            }
    
            public void updateExchanger(MyExchanger exchanger) {
    
                    gson = new Gson();
                    String exchangerjson = gson.toJson(exchanger, type);
                    editor = prefs.edit();
                    editor.putString(res.getString(R.string.key_exchanger), exchangerjson);
    
                    editor.commit();
    
            }
    
            public Exchanger getExchanger(){
    
                    String exchangerjson = prefs.getString(res.getString(R.string.key_exchanger), null);
                    Gson gson = new Gson();
                    if(exchangerjson!=null){
                   My Exchanger exchanger = gson.fromJson(exchangerjson, type);
    
                    return exchanger;
                    }
    
                    return new MyExchanger();
            }
    
    }
    

    实施可能看起来有点喜欢这个

    //Somewhere in the activity
    
    ExchangerUtils utils = new ExchangerUtils(this);
    MyExchanger exchanger = utils.getExchanger();
    
    exchanger.setName("a name");
    utils.update(exchanger);
    

    我已经在我的两个应用中测试了它,它运行得很好,也可以使用旧手机和大量对象(> 100)。

    实现中唯一的东西是我必须更新对象。如果没有这种方法,怎么办?

    我有任何改进建议,请随时发布。

2 个答案:

答案 0 :(得分:4)

我创建了一个能够以您描述的方式轻松保存数据的库: DroidPrefs

您可以非常轻松地保存和加载值,但您不必担心使用TypeTokens的助手类以及所有这些。

从这个POJO

public class Animal
{
    private String mName;
    private String mBreed;
    private int mLegs;

    public Animal() {
        mName = "";
        mBreed = "";
        mLegs = 0;
    }

    public Animal(String name, String breed, int legs)
    {
        mName = name;
        mBreed = breed;
        mLegs = legs;
    }
}

保存对象

Animal newAnimal = new Animal("Gitty", "Octocat", 8);
DroidPrefs.instance(context).put("animal", newAnimal).apply();

加载对象

Animal newAnimal = DroidPrefs.instance(context).get("animal", Animal.class);

如果该对象先前未被序列化,则将使用默认构造函数创建一个新对象。

答案 1 :(得分:1)

嗯。这是一个有趣的想法,但SharedPreferences并不是传输和保存数据的最佳选择。当然,正如您所见,Application或任何其他类型的静态变量都没有。

我不能在不知道你想要做什么的情况下提出一个确切的选择,但在相同的情况下,我会使用由内容提供商包装的数据库。您可能会认为这对于您尝试做的事情来说太多了,但数据库是持久的,可索引的,可搜索的,并且易于更新。

如果要在活动之间传递瞬态数据,请在扩展数据中使用Intents和对象。如果数据不是真正短暂的,那就坚持下去吧。如果是少量数据(例如设置),则将其保留在SharedPreferences中。如果是大量的线性数据(例如JPEG图像),则将其保存在文件中。如果是结构化数据,请将其保留在数据库中。但是,不要试图将其中一个替换为另一个,因为它“更容易”。