Android SharedPreferences超轻量型数据存储

时间:2022-04-27 00:17:13
SharedPreferences(相关信息)是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态,一般在Activity中 重载窗口状态onSaveInstanceState保存一般使用SharedPreferences完成,它提供了Android平台常规的Long长 整形、Int整形、String字符串型的保存。
它是什么样的处理方式呢? SharedPreferences类似过去Windows系统上的ini配置文件,但是它分为多种权限,可以全局共享访问,android123提示最终是以xml方式来保存,整体效率来看不是特别的高,对于常规的轻量级而言比SQLite要好不少,如果真的存储量不大可以考虑自己定义文件格式。xml 处理时Dalvik会通过自带底层的本地XML Parser解析,比如XMLpull方式,这样对于内存资源占用比较好。
它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。
其存储位置在/data/data/<包名>/shared_prefs目录下。
SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor 对象实现。
Android SharedPreferences超轻量型数据存储Android SharedPreferences超轻量型数据存储
Android SharedPreferences超轻量型数据存储Android SharedPreferences超轻量型数据存储
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 android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:orientation="horizontal">
		<TextView android:text="键" android:id="@+id/keyview"
			android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
		<EditText android:id="@+id/key" android:layout_width="fill_parent"
			android:layout_height="wrap_content" android:layout_toRightOf="@+id/keyview"></EditText>
	</RelativeLayout>
	<RelativeLayout android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:orientation="horizontal">
		<TextView android:text="值" android:id="@+id/valueview"
			android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
		<EditText android:id="@+id/value" android:layout_width="fill_parent"
			android:layout_height="wrap_content" android:layout_toRightOf="@+id/valueview"
			android:password="true"></EditText>
	</RelativeLayout>
	<LinearLayout android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:orientation="horizontal">
		<Button android:text="插入" android:id="@+id/insert"
			android:layout_width="wrap_content" android:layout_height="wrap_content" />
		<Button android:text="删除" android:id="@+id/delete"
			android:layout_width="wrap_content" android:layout_height="wrap_content" />
		<Button android:text="修改" android:id="@+id/modify"
			android:layout_width="wrap_content" android:layout_height="wrap_content" />
		<Button android:text="查询" android:id="@+id/query"
			android:layout_width="wrap_content" android:layout_height="wrap_content" />
		<Button android:text="清空" android:id="@+id/clear"
			android:layout_width="wrap_content" android:layout_height="wrap_content" />
	</LinearLayout>
	<TextView android:id="@+id/content" android:layout_width="fill_parent" android:layout_height="fill_parent"/>
</LinearLayout>  
MainActivity.java
 
MainActivity.java
public class MainActivity extends Activity {
    private EditText keyET;
    private EditText valueET;
    private Button insertBtn;
    private Button deleteBtn;
    private Button modifyBtn;
    private Button queryBtn;
    private Button clearBtn;
    private TextView textView;
    /** 存储的文件名 */
    public static final String DATABASE = "Database"; 
    /** 存储后的文件路径:/data/data/<package name>/shares_prefs + 文件名.xml */ 
    public static final String PATH = "/data/data/code.sharedpreferences/shared_prefs/Database.xml"; 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        keyET = (EditText) findViewById(R.id.key);
        valueET = (EditText) findViewById(R.id.value); 
        
        insertBtn = (Button) findViewById(R.id.insert);
        deleteBtn = (Button) findViewById(R.id.delete);
        modifyBtn = (Button) findViewById(R.id.modify);
        queryBtn = (Button) findViewById(R.id.query);
        clearBtn = (Button) findViewById(R.id.clear);
        // 用于显示存储文件中数据
        textView = (TextView) findViewById(R.id.content);
        
        insertBtn.setOnClickListener(new OperateOnClickListener());
        deleteBtn.setOnClickListener(new OperateOnClickListener());
        modifyBtn.setOnClickListener(new OperateOnClickListener());
        queryBtn.setOnClickListener(new OperateOnClickListener());
        clearBtn.setOnClickListener(new OperateOnClickListener());
    }

    class OperateOnClickListener implements OnClickListener {
        @Override
        public void onClick(View v) {
            // 获取SharedPreferences对象
            // 返回的数据getSharedPreferences(字符串,整数)。
            // 几种getSharedPreferences权限
            // MODE_PRIVATE 值为0  默认模式,创建的文件只能通过调用应用程序(或所有应用程序共享相同的用户ID)。 
            //  MODE_WORLD_READABLE 1 文件创建模式:允许所有其他应用程序已经创建的文件的读权限。 
            // MODE_WORLD_WRITEABLE 值为2 文件创建模式:允许所有其他应用程序有写权限创建的文件。
            SharedPreferences sp = getSharedPreferences(DATABASE,Context.MODE_PRIVATE);
            //SharedPreferences sp = getSharedPreferences(DATABASE,Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE); 
            
            // 获取Editor对象 
            Editor editor = sp.edit();
            //  获取界面中的信息
            String key = keyET.getText().toString();
            String value = valueET.getText().toString(); 
            switch (v.getId()) {
            // 插入数据
            case R.id.insert:  
                editor.putString(key, value);
                editor.commit();
                textView.setText(MainActivity.this.print());
                break;
            // 删除数据
            case R.id.delete:
                editor.remove(key);
                editor.commit();
                textView.setText(MainActivity.this.print());
                break;
            // 修改数据
            case R.id.modify:
                editor.putString(key, value);
                editor.commit();
                textView.setText(MainActivity.this.print());
                break;
            // 查询数据
            case R.id.query:   
                String result = sp.getString(key, "");
                textView.setText("key=" + key + ",value=" + result);
                break;
            // 清空所有数据
            case R.id.clear:
                editor.clear();
                editor.commit();
                textView.setText(MainActivity.this.print());
                break;
            }

        }
    }

    /** 获取存储文件的数据 */
    private String print() {
        //用一个StringBuffer来接收
        StringBuffer buff = new StringBuffer();
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    new FileInputStream(PATH)));
            String str;
            while ((str = reader.readLine()) != null) {
                buff.append(str + "\n");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return buff.toString();
    } 
}