2013-04-05 103 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