android使用SharedPreferences進行數(shù)據(jù)存儲
很多時候我們開發(fā)的軟件需要向用戶提供軟件參數(shù)設(shè)置功能,例如我們常用的QQ,用戶可以設(shè)置是否允許陌生人添加自己為好友。對于軟件配置參數(shù)的保存,如果是window軟件通常我們會采用ini文件進行保存,如果是j2se應(yīng)用,我們會采用properties屬性文件或者xml進行保存。如果是Android應(yīng)用,我們最適合采用什么方式保存軟件配置參數(shù)呢?Android平臺給我們提供了一個SharedPreferences類,它是一個輕量級的存儲類,特別適合用于保存軟件配置參數(shù)。使用SharedPreferences保存數(shù)據(jù),其背后是用xml文件存放數(shù)據(jù),文件存放在/data/data/<package name>/shared_prefs目錄下:
SharedPreferences sharedPreferences = getSharedPreferences("ljq", Context.MODE_PRIVATE); Editor editor = sharedPreferences.edit();//獲取編輯器 editor.putString("name", "林計欽"); editor.putInt("age", 24); editor.commit();//提交修改
生成的ljq.xml文件內(nèi)容如下:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <string name="name">林計欽</string> <int name="age" value="24" /> </map>
因為SharedPreferences背后是使用xml文件保存數(shù)據(jù),getSharedPreferences(name,mode)方法的第一個參數(shù)用于指定該文件的名稱,名稱不用帶后綴,后綴會由Android自動加上。方法的第二個參數(shù)指定文件的操作模式,共有四種操作模式,這四種模式前面介紹使用文件方式保存數(shù)據(jù)時已經(jīng)講解過。如果希望SharedPreferences背后使用的xml文件能被其他應(yīng)用讀和寫,可以指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE權(quán)限。
另外Activity還提供了另一個getPreferences(mode)方法操作SharedPreferences,這個方法默認(rèn)使用當(dāng)前類不帶包名的類名作為文件的名稱。
訪問SharedPreferences中的數(shù)據(jù)
訪問SharedPreferences中的數(shù)據(jù)代碼如下:
SharedPreferences sharedPreferences = getSharedPreferences("ljq", Context.MODE_PRIVATE); //getString()第二個參數(shù)為缺省值,如果preference中不存在該key,將返回缺省值 String name = sharedPreferences.getString("name", ""); int age = sharedPreferences.getInt("age", 1);
如果訪問其他應(yīng)用中的Preference,前提條件是:該preference創(chuàng)建時指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE權(quán)限。
如:有個<package name>為com.ljq.action的應(yīng)用使用下面語句創(chuàng)建了preference。
getSharedPreferences("ljq", Context.MODE_WORLD_READABLE);
其他應(yīng)用要訪問上面應(yīng)用的preference,首先需要創(chuàng)建上面應(yīng)用的Context,然后通過Context 訪問preference ,訪問preference時會在應(yīng)用所在包下的shared_prefs目錄找到preference :
Context otherAppsContext = createPackageContext("com.ljq.action", Context.CONTEXT_IGNORE_SECURITY); SharedPreferences sharedPreferences = otherAppsContext.getSharedPreferences("ljq", Context.MODE_WORLD_READABLE); String name = sharedPreferences.getString("name", ""); int age = sharedPreferences.getInt("age", 0);
如果不通過創(chuàng)建Context訪問其他應(yīng)用的preference,也可以以讀取xml文件方式直接訪問其他應(yīng)用preference對應(yīng)的xml文件,如:
File xmlFile = new File("/data/data/<package name>/shared_prefs/itcast.xml");//<package name>應(yīng)替換成應(yīng)用的包名
案例:
string.xml文件
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, SpActivity!</string> <string name="app_name">軟件配置參數(shù)</string> <string name="name">姓名</string> <string name="age">年齡</string> <string name="button">保存設(shè)置</string> <string name="showButton">顯示</string> </resources>
main.xml布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/name" android:textSize="20px" android:id="@+id/nameLable" /> <EditText android:layout_width="80px" android:layout_height="wrap_content" android:layout_toRightOf="@id/nameLable" android:layout_alignTop="@id/nameLable" android:layout_marginLeft="10px" android:id="@+id/name" /> </RelativeLayout> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20px" android:text="@string/age" android:id="@+id/ageLable" /> <EditText android:layout_width="80px" android:layout_height="wrap_content" android:layout_toRightOf="@id/ageLable" android:layout_alignTop="@id/ageLable" android:layout_marginLeft="10px" android:id="@+id/age" /> </RelativeLayout> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button" android:id="@+id/button" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/showButton" android:layout_toRightOf="@id/button" android:layout_alignTop="@id/button" android:id="@+id/showButton" /> </RelativeLayout> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="20px" android:id="@+id/showText" /> </LinearLayout>
package com.ljq.activity; import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; public class SpActivity extends Activity { private EditText nameText; private EditText ageText; private TextView resultText; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); nameText = (EditText)this.findViewById(R.id.name); ageText = (EditText)this.findViewById(R.id.age); resultText = (TextView)this.findViewById(R.id.showText); Button button = (Button)this.findViewById(R.id.button); Button showButton = (Button)this.findViewById(R.id.showButton); button.setOnClickListener(listener); showButton.setOnClickListener(listener); // 回顯 SharedPreferences sharedPreferences=getSharedPreferences("ljq123", Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE); String nameValue = sharedPreferences.getString("name", ""); int ageValue = sharedPreferences.getInt("age", 1); nameText.setText(nameValue); ageText.setText(String.valueOf(ageValue)); } private View.OnClickListener listener = new View.OnClickListener(){ public void onClick(View v) { Button button = (Button)v; //ljq123文件存放在/data/data/<package name>/shared_prefs目錄下 SharedPreferences sharedPreferences=getSharedPreferences("ljq123", Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE); switch (button.getId()) { case R.id.button: String name = nameText.getText().toString(); int age = Integer.parseInt(ageText.getText().toString()); Editor editor = sharedPreferences.edit(); //獲取編輯器 editor.putString("name", name); editor.putInt("age", age); editor.commit();//提交修改 Toast.makeText(SpActivity.this, "保存成功", Toast.LENGTH_LONG).show(); break; case R.id.showButton: String nameValue = sharedPreferences.getString("name", ""); int ageValue = sharedPreferences.getInt("age", 1); resultText.setText("姓名:" + nameValue + ",年齡:" + ageValue); break; } } }; }
運行結(jié)果
如何訪問其他應(yīng)用中的Preference
package com.ljq.sp; import java.io.File; import java.io.FileInputStream; import android.content.Context; import android.content.SharedPreferences; import android.test.AndroidTestCase; import android.util.Log; public class AccessSharePreferenceTest extends AndroidTestCase{ private static final String TAG = "AccessSharePreferenceTest"; /** * 訪問SharePreference的方式一,注:權(quán)限要足夠 * @throws Exception */ public void testAccessPreference() throws Exception{ String path = "/data/data/com.ljq.activity/shared_prefs/ljq123.xml"; File file = new File(path); FileInputStream inputStream = new FileInputStream(file); //獲取的是一個xml字符串 String data = new FileService().read(inputStream); Log.i(TAG, data); } /** * 訪問SharePreference的方式二,注:權(quán)限要足夠 * @throws Exception */ public void testAccessPreference2() throws Exception{ Context context = this.getContext().createPackageContext("com.ljq.activity", Context.CONTEXT_IGNORE_SECURITY); SharedPreferences sharedPreferences = context.getSharedPreferences("ljq123", Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE); String name = sharedPreferences.getString("name", ""); int age = sharedPreferences.getInt("age", 1); Log.i(TAG, name + " : " +age); } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- android?studio數(shù)據(jù)存儲建立SQLite數(shù)據(jù)庫實現(xiàn)增刪查改
- Android 通過SQLite數(shù)據(jù)庫實現(xiàn)數(shù)據(jù)存儲管理
- Android四種數(shù)據(jù)存儲的應(yīng)用方式
- Android基礎(chǔ)教程數(shù)據(jù)存儲之文件存儲
- Android SharedPreferences實現(xiàn)數(shù)據(jù)存儲功能
- Android開發(fā)教程之ContentProvider數(shù)據(jù)存儲
- 詳解Android的網(wǎng)絡(luò)數(shù)據(jù)存儲
- 5種Android數(shù)據(jù)存儲方式匯總
- 詳解Android數(shù)據(jù)存儲之SQLCipher數(shù)據(jù)庫加密
- Android 單例模式實現(xiàn)可復(fù)用數(shù)據(jù)存儲的詳細過程
相關(guān)文章
Android實現(xiàn)底部半透明彈出框PopUpWindow效果
這篇文章主要為大家詳細介紹了Android實現(xiàn)底部半透明彈出框PopUpWindow效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07TextView顯示文本控件兩種方法 TextView顯示link的方法
這篇文章主要為大家詳細介紹了TextView顯示文本控件兩種方法,TextView顯示link的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08Android中Java instanceof關(guān)鍵字全面解析
instanceof關(guān)鍵字用于判斷一個引用類型變量所指向的對象是否是一個類(或接口、抽象類、父類)的實例.這篇文章主要介紹了Android中Java instanceof關(guān)鍵字全面解析的相關(guān)資料,需要的朋友可以參考下2016-07-07Android中backgroundDimEnabled的作用
這篇文章主要介紹了Android中backgroundDimEnabled的作用的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10Android user版通過adb_enable開啟adb 調(diào)試 不提示對話框的流程分析
這篇文章主要介紹了Android user版通過adb_enable開啟adb 調(diào)試 不提示對話框的流程分析,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05