2013-04-05 99 views
1

在应用程序对象遇到困难之后,我对使用GSON Libary和Sharedpreferences在活动之间交换数据有一个(新的?)想法。这具有很大的优势,即如果应用程序关闭,对象不会被销毁。使用GSON将对象存储到Sharedpreferences中。你怎么看?

我想知道你在

  1. 安全方面的想法
  2. 性能自动
  3. 应用稳定性

这是我做的。首先创建一个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)。

实现中唯一的安永事情是我必须更新对象。任何想法如何使用这种方法做到这一点?

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

回答

1

嗯。这是一个有趣的想法,但SharedPreferences对于传输和保存数据并不是最好的。当然,正如你所看到的,Application或任何其他类型的静态变量都不是。

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

如果您想要在活动之间传递瞬态数据,请在其扩展数据中使用Intents和对象。如果数据不是非常短暂的,请将其保存在某个地方。如果是少量数据(如设置),请将其保存在SharedPreferences中。如果是大量的线性数据(如JPEG图像),请将其保存在文件中。如果它是结构化数据,请将其保存在数据库中。但是,不要试图用其中一种替代另一种,因为它更“容易”。

+0

最后一句似乎是有道理的,唯一的问题是,为什么我不应该用它替代它,如果它更容易? – w4beda 2013-04-06 11:05:23

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

如果对象是以前没有序列化,一个新的对象将使用默认构造函数创建。

+0

我不必担心实现中的TypeTokens,因为我只使用一个对象MyExchanger Object来存放所有其他对象。 – w4beda 2013-06-27 20:02:30