1. 程式人生 > 其它 >【專業技術】Android資料儲存之SharedPreferences

【專業技術】Android資料儲存之SharedPreferences

前言:

程式中處理的大部分問題都與資料有關,讀取資料顯示在UI上,讀取的資料可以是本地的,也可以是網路的。儲存使用者資料到儲存空間,可以是本地的資料庫,檔案等,也可以是儲存到網路伺服器。總之大部分的程式都是在和資料打交道。Android中資料儲存比較方便靈活,今天就按照官網說說資料儲存。

大多數Android應用程式都需要儲存資料,在Android生命週期方法onPause中,你可以儲存使用者在程式中的進度資料,在使用者再次進入程式時進行讀取恢復。可能一些應用程式不需要儲存使用者的進度資訊,但是使用者對於應用程式的設定資訊一定要儲存。很多應用需要儲存大量的資料到資料庫或者檔案裡,比如看電視的應用,需要儲存大量的頻道資訊。下面就給大家介紹一下在Android中資料是如何儲存的。

key-value鍵值集合儲存資料:

如果你有一些相對較少的鍵值資料集需要儲存,那麼SharedPreferences應該能夠滿足你。一個SharedPreferences物件指向了一個鍵值對形式儲存資料的Shared Preference檔案,它提供了一些很方便讀取和寫入資料的方法。每一個SharedPreferences檔案都被Android framework管理,可以是隻能建立它的應用程式訪問,也可以分享給其他應用程式。怎麼用SharedPreferences儲存資料呢?

獲取SharedPreferences物件:

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

1、getSharedPreferences(String name, int mode)

此方通通過Context物件呼叫,返回一個唯一的SharedPreferences物件,這裡的唯一指的是通過name來查詢的唯一對應的SharedPreferences,如果沒有查詢到則會用name來建立一個。唯一的好處就是你在一個地方儲存後在另外的地方立刻就能讀取到這個值。用mode來區分建立的SharedPreferences物件共享型別,MODE_PRIVATE表示該應用程式私有,MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE是表示全域性讀或寫許可權,MODE_MULTI_PROCESS表示可以跨程序訪問。

2、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的方法和注意事項,有哪些地方寫的不好還請大神們批評指正。