標籤:
前言:
程式中處理的大部分問題都與資料有關,讀取資料顯示在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的方法和注意事項,有哪些地方寫的不好還請大神們批評指正。
本文屬原創,轉載請註明出處,違者必究
關注公眾平台:程式員互動聯盟(coder_online),你可以第一時間擷取原創技術文章,和(java/C/C++/Android/Windows/Linux)技術大牛做朋友,線上交流編程經驗,擷取編程基礎知識,解決編程問題。程式員互動聯盟,開發人員自己的家。
Android資料儲存之SharedPreference