Android编程学习笔记 之 SharedPreferences数据存储

SharedPreferences是一种轻型的数据存储方式,类似于Map采用键值对key-value的方式存储在XML文件中。

如果是root过的手机,可以在date/date/包名/shared_prefs中找到存储的XML文件。

SharedPreferences一般是用来存储不重要的简单的配置信息。

例如,电子书上次读到了哪一页,五子棋的游戏设置参数,自动同步几分钟进行一次同步等等。


SharedPreferences对象本身只支持读取数据,读写的权限有:

Context.MODE_PRIVATE:只能被本应用程序读、写

Context.MODE_WORLD_READABLE:能被其他应用,但不能写。(已过时)

Context.MODE_WORLD_WRITEABLE:能被其他应用读、写。(已过时)

这两个过时的权限会造成安全漏洞,有需要的话可以使用ContentProvider来代替


如果需要存储数据,需要使用SharedPreferences的内部类Editor

实现SharedPreferences存储的步骤如下:

获取SharedPreferences对象

获取SharedPreferences.Editor对象

使用Editor中的putString(key, value)等方法存储基本数据类型

使用Editor中的commit()提交存储的数据(相当于保存修改)

使用SharedPreferences对象中的getString()等方法获取数据


获取SharedPreferences对象

获取SharedPreferences对象的方法有两种

//第一种,通过Preference管理获得默认的SharedPreferences对象
SharedPreferences share = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);

//第二种,通过Context中的getSharedPreferences方法获得SharedPreferences对象,Demo中使用第二种
SharedPreferences share = getSharedPreferences(String name, int MODE);//name表示存放的XML的名字,MODE表示模式

我们上面有解释了各种模式,这里只是一个简单的demo,所以使用第二种,模式是MODE_PRIVATE


获取SharedPreferences.Editor对象

在SharedPreferences对象中有一个edit()方法,用来返回内部的Editor对象

SharedPreferences.Editor editor = share.edit();


使用Editor中的putString(key, value)等方法存储基本数据类型

之后我们使用Editor进行数据的存储,editor只能存储基本的数据类型,如果是自定义的类型则不能存储

(如果非要存储自定义类型,也可以将自定义类型拆开来,将其中的基本数据类型进行分别存储)

editor.putBoolean(String key, boolean value);//存储Boolean类型
editor.putInt(String key, int value);//存储int类型
editor.putFloat(String key, float value);//存储float类型
editor.putLong(String key, long value);//存储long类型
editor.putString(String key, String value);//存储String类型
editor.putStringSet(String key, Set<string> value);//存储Set<String>类型,本质还是存储String类型</string>

还记得我们上面说的SharedPreferences是以键值对的方式存储数据吗?这里的key-value就是键值对。

后面会通过键,来寻找值。


使用Editor中的commit()提交存储的数据(相当于保存修改)

当然,在我们努力的修改完数据之后,我们还要保存修改,不然就前功尽弃了

editor里面有一个commit()方法来保存修改(之前的关于Fragment动态加载的博客中也有出现commit()方法)

editor.commit();//提交保存数据


使用SharedPreferences对象中的getString()等方法获取数据

之后我们如果需要提取数据,那么就不再使用Editor对象了,直接使用SharedPreferences对象即可。

和Editor存储的方法相对应,SharedPreferences中也有一些读取的方法

share.getBoolean(String key, boolean default);//读取Boolean类型
share.getInt(String key, int default);//读取int类型
share.getFloat(String key, float default);//读取float类型
share.getLong(String key, long default);//读取long类型
share.getString(String key, String default);//读取String类型
share.getStringSet(String key, Set default);//读取Set<string>类型,本质还是读取String类型
share.getAll()//读取所有数据,并返回一个Map类型</string>

这里可能有人会奇怪,为什么读取数据也要加入一个值的参数。

这是为了在SharedPreferences找不到该键值对,也就是获取不到数据的时候,能返回一个default的默认值,提醒你找不到数据。


读、写其他应用的SharedPreferences应用

在读写其他应用的SharedPreferences前,首先要确定被读取的应用要有对应的访问权限。

如果是MODE_WORLD_WRITEABLE,则表明该SharedPreferences可被其他应用程序写入。

如果是MODE_WORLD_READABLE,则表明该SharedPreferences可被其他应用程序读取。

首先我们要获取被读写应用程序的Context上下文。

Context useCount = createPackageContext(String package, int MODE);//package为被读写应用的包名,MODE表示模式
Context useCount = createPackageContext("com.package.test", Context.CONTEXT_IGNORE_SECURITY);

这里的MODE有CONTEXT_INCLUDE_CODE和CONTEXT_IGNORE_SECURITY两种方式

CONTEXT_INCLUDE_CODE的意思是包括代码,也就是说可以执行这个包里面的代码。

CONTEXT_IGNORE_SECURITY的意思是忽略安全警告,如果不加这个标志的话,有些功能是用不了的,会出现安全警告。

获取了SharedPreferences之后,我们就要用之前讲过的方法进行读写,前提是要有权限。

Context useCount = createPackageContext("com.package.test", Context.CONTEXT_IGNORE_SECURITY);
SharedPreferences shares = useCount.getSharedPreferences("count", Context.MODE_WORLD_READABLE);
或者我们也可以用IO流来读取,但这不属于SharedPreferences的内容,而且也很繁琐,所以这里不讲。


以下附上简单的demo源码

public class MainActivity extends Activity{
    Button saveButton, loadButton;
    EditText editText;//要存入的数据
    TextView outputText;//读取并显示数据
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        saveButton = (Button) findViewById(R.id.saveButton);
        loadButton = (Button) findViewById(R.id.loadButton);
        editText = (EditText) findViewById(R.id.inputEdit);
        outputText = (TextView) findViewById(R.id.outputText);

        saveButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String value = editText.getText().toString();//获取editorText中的数据
                SharedPreferences share = getSharedPreferences("inputEdit", MODE_PRIVATE);
                //以私有模式打开或新建一个inputEdit.XML文件

                SharedPreferences.Editor editor = share.edit();//获取Editor对象
                editor.putString("key", value);//存入数据
                editor.commit();//保存修改,避免前功尽弃
            }
        });


        loadButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SharedPreferences share = getSharedPreferences("inputEdit", MODE_PRIVATE);
                //以私有模式打开或新建一个inputEdit.XML文件

                outputText.setText(share.getString("key", "没有存放"));//获取数据,如果找不到数据就返回"没有存放"
            }
        });
    }
}
<!--主Activity的布局文件-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <EditText
        android:id="@+id/inputEdit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <Button
        android:id="@+id/saveButton"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="存放"/>
    <TextView
        android:id="@+id/outputText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="获取的数据"/>
    <Button
        android:id="@+id/loadButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="读取"/>
</LinearLayout>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值