您的位置:首页 > 移动开发 > Android开发

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

2016-04-03 21:20 579 查看
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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: