Android數據存儲方式之SharedPreference

除瞭SQLite數據庫外,SharedPreferences也是一種輕型的數據存儲方式,它的本質是基於XML文件存儲key-value鍵值對數據,通常用來存儲一些簡單的配置信息。其存儲位置在/data/data/<包名>/shared_prefs目錄下。SharedPreferences對象本身隻能獲取數據而不支持存儲和修改,存儲修改是通過Editor對象實現。實現SharedPreferences存儲的步驟如下:

 

  一、根據Context獲取SharedPreferences對象

 

  二、利用edit()方法獲取Editor對象。

 

  三、通過Editor對象存儲key-value鍵值對數據。

 

  四、通過commit()方法提交數據。

 

具體實現代碼如下:

 

public class MainActivity extends Activity {

    @Override

    public void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.main);

       

       //獲取SharedPreferences對象

       Context ctx = MainActivity.this; //獲取上下文       

       SharedPreferences sp = ctx.getSharedPreferences("SP", MODE_PRIVATE);

       //存入數據

       Editor editor = sp.edit();

       editor.putString("STRING_KEY", "string");

       editor.putInt("INT_KEY", 0);

       editor.putBoolean("BOOLEAN_KEY", true);

       editor.commit();

       

       //返回STRING_KEY的值

       Log.d("SP", sp.getString("STRING_KEY", "none"));

       //如果NOT_EXIST不存在,則返回值為"none"

       Log.d("SP", sp.getString("NOT_EXIST", "none"));

    }

}

 

SP.xml文件的具體內容如下:

 

 <?xml version='1.0' encoding='utf-8' standalone='yes' ?>

<map>

<string name="STRING_KEY">string</string>

<int name="INT_KEY" value="0" />

<boolean name="BOOLEAN_KEY" value="true" />

</map>

 

 

 在程序代碼中,通過getXXX方法,可以方便的獲得對應Key的Value值,如果key值錯誤或者此key無對應value值,SharedPreferences提供瞭一個賦予默認值的機會,以此保證程序的健壯性。如下圖運行結果中因為並無值為"NOT_EXIST"的Key,所以Log打印出的是其默認值:“none”。在訪問一個不存在key值這個過程中,並無任何異常拋出。

 

 

 

SharedPreferences對象與SQLite數據庫相比,免去瞭創建數據庫,創建表,寫SQL語句等諸多操作,相對而言更加方便,簡潔。但是SharedPreferences也有其自身缺陷,比如其職能存儲boolean,int,float,long和String五種簡單的數據類型,比如其無法進行條件查詢等。所以不論SharedPreferences的數據存儲操作是如何簡單,它也隻能是存儲方式的一種補充,而無法完全替代如SQLite數據庫這樣的其他數據存儲方式。

 

 

例子:

 

PerferenceService.java

package com.service;

import java.util.HashMap;

import java.util.Map;

import android.content.Context;

import android.content.SharedPreferences;

import android.content.SharedPreferences.Editor;

 

public class PerferenceService {

private Context context;

public PerferenceService(Context context){

this.context=context;

}

/**

 * 保存參數

 * @param name

 * @param age

 */

public void save(String name,int age){

SharedPreferences preference =context.getSharedPreferences("olay", Context.MODE_APPEND);//得到SharedPreferenceduixiang

Editor editor=preference.edit(); //得到edit編譯器

editor.putString("name", name);

editor.putInt("age", age);

editor.commit(); //提交之後才寫入xml中,不提交隻是在緩存中而已

}

/**

 * 顯示參數

 * @return

 */

public Map<String,String>  put(){

Map<String,String> map =new HashMap<String, String>();

SharedPreferences preference = context.getSharedPreferences("olay", Context.MODE_APPEND);

map.put("name", preference.getString("name", ""));

map.put("age",String.valueOf(preference.getInt("age", 0)) );

return map;

}

 

}

 

 

 

MainActivity .java

 

package com.example.sharedpreferences;

 

import java.util.HashMap;

import java.util.Map;

 

import com.service.PerferenceService;

 

import android.os.Bundle;

import android.app.Activity;

import android.view.Menu;

import android.view.View;

import android.widget.EditText;

import android.widget.Toast;

 

public class MainActivity extends Activity {

private PerferenceService perf;

private EditText nameText,ageText;

 

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

perf = new PerferenceService(this);

nameText = (EditText) findViewById(R.id.name);

ageText = (EditText) findViewById(R.id.age);

//啟動顯示參數

Map<String,String> map = new HashMap<String,String>();

map=perf.put();

nameText.setText(map.get("name"));

ageText.setText(map.get("age"));

}

public void save(View view){

String name = nameText.getText().toString();

int age = Integer.valueOf(ageText.getText().toString());

perf.save(name, age);

Toast.makeText(MainActivity.this, "保存成功", Toast.LENGTH_LONG).show();

}

 

}

 

 

 

 

發佈留言