Android數據保存之SharedPreference


前言:

程序中處理的大部分問題都與數據有關,讀取數據顯示在UI上,讀取的數據可以是本地的,也可以是網絡的。保存用戶數據到存儲空間,可以是本地的數據庫,文件等,也可以是保存到網絡服務器。總之大部分的程序都是在和數據打交道。Android中數據保存比較方便靈活,今天就按照官網說說數據保存。

大多數Android應用程序都需要存儲數據,在Android生命周期方法onPause中,你可以保存用戶在程序中的進度數據,在用戶再次進入程序時進行讀取恢復。可能一些應用程序不需要保存用戶的進度信息,但是用戶對於應用程序的設置信息一定要保存。很多應用需要保存大量的數據到數據庫或者文件里,比如看電視的應用,需要保存大量的頻道信息。下面就給大家介紹一下在Android中數據是如何保存的。

 

key-value鍵值集合保存數據:

如果你有一些相對較少的鍵值數據集需要保存,那么SharedPreferences應該能夠滿足你。一個SharedPreferences對象指向了一個鍵值對形式保存數據的Shared Preference文件,它提供了一些很方便讀取和寫入數據的方法。每一個SharedPreferences文件都被Android framework管理,可以是只能創建它的應用程序訪問,也可以分享給其他應用程序。怎么用SharedPreferences·保存數據呢?

 

獲取SharedPreferences對象:

你可以創建一個新的Shared Preference 共享文件,如果已經存在則直接返回指向該共享文件的SharedPreferences該對象,有兩種方法可以完成這個工作:

  • getSharedPreferences(String name, int mode)
    此方通通過Context對象調用,返回一個唯一的SharedPreferences對象,這里的唯一指的是通過name來查找的唯一對應的SharedPreferences,如果沒有查找到則會用name來創建一個。唯一的好處就是你在一個地方保存后在另外的地方立刻就能讀取到這個值。用mode來區分創建的SharedPreferences對象共享類型,MODE_PRIVATE表示該應用程序私有,MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE是表示全局讀或寫權限,MODE_MULTI_PROCESS表示可以跨進程訪問。
  • getPreferences(int mode)
    此方法被Activity對象調用,會創建一個只能被該Activity訪問的SharedPreferences對象,該方法是封裝的上面的那個方法,默認創建的SharedPreferences名字是該Activity的名字,所以不用傳此參數,mode只有MODE_PRIVATE、MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE三個可選,缺少MODE_MULTI_PROCESS,因為只有該Activity有權限訪問,所以跨進程沒什么用。
舉個例子:
Context context = getActivity();
SharedPreferences sharedPref = context.getSharedPreferences(
        getString(R.string.preference_file_key),Context.MODE_PRIVATE);

  

上面的代碼是在一個Fragment中調用的,getActivity()是獲取Fragment所在的Activity對象(Activity是繼承自Context),R.string.preference_file_key是該SharedPreferences的名字,mode是Context.MODE_PRIVATE私有類型。
 
注意:當你給SharedPreferences起名字的時候最好是復雜點的,這樣就能保證不會有名字重復卻屬於不同應用程序的SharedPreferences,最好是以你的應用包名再加上其他構成,比如"com.example.myapp.PREFERENCE_FILE_KEY"。
 
獲取一個Activity的SharedPreferences代碼如下:
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
上面是創建了一個Activity私有的SharedPreferences對象。
 
注意:當你創建SharedPreferences時mode值的是MODE_WORLD_PRIVATE或者MODE_WORLD_WRITEABLE,你創建的Shared Preferences文件是可以被其他應用程序訪問的。這兩種mode都是比較危險的,因為其他應用程序也能訪問,所以會造成數據外泄。google給出的建議是盡量不要用這種機制來進行數據共享傳遞,可以用其他方法來代替這種機制,比如使用ContentProvider,BroadcastReceiver或者Service。
 

寫入數據到Shared Preferences文件:

寫入數據到Shared Preferences是通過獲取SharedPreferences.Editor對象,調用該對象的一些putXX(key,value)方法來寫入key對應的值,然后調用commit()方法提交寫入完成的,代碼如下:

 
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putInt(getString(R.string.saved_high_score), newHighScore);
editor.commit();

  

SharedPreferences.Editor對象的putXX(String key,數據類型)方法可以保存boolean、int、float、long、String和Set<String>類型的數據,但是put方法只是建立好鍵值對的數據聯系,並沒有保存,直到你調用commit()或者apply()方法。調用remove(String key)可以清除key對應的數據(還需要調用commit方法提交操作),你也可以調用clear()方法把所有數據清除掉。
 
注意:commit()和apply()都是提交對數據的操作,但是它們還是有些區別的:
1、commit方法有返回值,返回值是一個boolean變量,表示你的保存動作是否成功,apply是沒有返回值的,所以如果你不需要返回值,也不關心提交是否成功可以用apply來代替commit;
2、apply是先把數據更改提交到內存,然后再異步保存到磁盤上,而commit這兩個操作是同步的,所以在進行頻繁提交數據更改時apply更為高效;
 

讀取數據從Shared Preferences文件:

 
從Shared Preferences文件讀取之前保存的數據比較簡單,通過SharedPreferences對象的getXX方法就能完成,代碼如下:
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
int defaultValue = getResources().getInteger(R.string.saved_high_score_default);
long highScore = sharedPref.getInt(getString(R.string.saved_high_score), defaultValue);

  

SharedPreferences的getXX(String key, defValue)方法key就是之前調用SharedPreferences.Editor的put(String key,數據類型)方法時的key,defValue是在找不到對應的key的數據時返回的默認數據。
 

總結:

保存數據分四步:
1、獲取SharedPreferences對象;
2、獲取SharedPreferences.Editor對象;
3、調用put方法添加數據;
4、調用commit保存數據;
獲取數據很簡單,分兩步:
1、獲取SharedPreferences對象;
2、調用get方法獲取key對應的值;
 

以上就是利用SharedPreferences進行數據保存的知識,基本上包含了所有使用SharedPreferences的方法和注意事項,有哪些地方寫的不好還請大神們批評指正。下一篇文章繼續聊Android中的數據保存之文件保存,謝謝大家!

本文屬原創,轉載請注明出處,違者必究

關注微信公眾平台:程序員互動聯盟(coder_online),你可以第一時間獲取原創技術文章,和(java/C/C++/Android/Windows/Linux)技術大牛做朋友,在線交流編程經驗,獲取編程基礎知識,解決編程問題。程序員互動聯盟,開發人員自己的家。

Android binder學習一:主要概念


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM