这一节,我们接着前面的介绍,讨论一下第五个议题,其实就是关于Android中的数据存储问题。我们先来看看有哪些常见的数据存储方式:文件存储、数据库存储这些都是比较常见的方式,在Android中也提供了这些存储方式。当然还有就像之前介绍的那样,主要包含两大类,一类是文档类的数据,主要是用文件或者数据库来存储,第二类就是配置文件(例如日历视图的配置文件:周视图或者日视图等等)的存储,者在Android中使用的是Preference来实现的。当然,我们这里的存储不仅仅是通常理解的store的概念,还包括获取这些数据,对数据进行一些操作等等。还有一点的就是Android中各个进程是相互独立的,这就涉及到数据共享问题,例如:联系人这些数据被很多应用共享,电话、短信等等!那Android是怎么实现多个进程之间共享数据的呢?这就是Android四大组件之一的Content Provider。所以,和这一节相关的内容比较多,我们分为以下3个part来记录!
part1:介绍Preference存储;
part2:介绍SQLite和File存储;
part3:介绍Content Provider;
很自然,我们首先想到的就是获取SharedPreferences,然后在进行操作。主要使用如下两个接口:
现在思路比较清晰了,我们可以通过Context..getSharedPreferences(String name, int mode)方法来获取SharedPreferences接口然后再利用它内部的Editor接口对数据进行操作。
Context..getSharedPreferences(String name, int mode)方法的详细说明如下图:
第二个参数看上面的说明就一目了然了,就是操作模式,可读可写等四种类型。主要说一下第一个参数,Pregerences对数据的操作都是通过对一个XML文件进行操作,而XML文件里面的内容是以键值对的形式保存的,第一个参数就是这个XML文件的文件名。如果这个文件不存在,那么当你视图调用Editor这个接口去获取或者操作其中的元素的时候,这个文件就会被创建,接着会调用Editor接口的commit()方法对修改进行提交保存。
在官方文档中有一些代码片段对我们的思考起到非常重要的作用,这里将其摘录如下:
public class CalendarActivity extends Activity {
...
static final int DAY_VIEW_MODE = 0;
static final int WEEK_VIEW_MODE = 1;
private SharedPreferences mPrefs;
private int mCurViewMode;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SharedPreferences mPrefs = getSharedPreferences();
mCurViewMode = mPrefs.getInt("view_mode", DAY_VIEW_MODE);
}
protected void onPause() {
super.onPause();
SharedPreferences.Editor ed = mPrefs.edit();
ed.putInt("view_mode", mCurViewMode);
ed.commit();
}
}
以上这段代码首先获取SharedPreferences接口,然后获取view_mode域的值。最后在此Activity处于暂停状态的时候,调用Editor接口中的putInt()方法保存view_mode域的值,这样就能避免当Activity不处于与运行状态时数据会丢失的现象。
这里,我们也用一个简单的例子来测试一下自己的想法:在Activity上显示一个文本编辑框,用户可以在里面输入文本,当退出这个activity再次进入这个activity时数据仍然能出现在此activity上面!
第一步:创建一个新的工程,Preferences;
第二步:修改布局文件,在上面放置一个文本编辑框EditText组件;
第三步:修改java源文件,添加一些代码,和上面的示例代码类似,如下:
private EditText editText;
private static final String TEST = "test";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
editText = (EditText)findViewById(R.id.EditText01);
SharedPreferences pre = this.getSharedPreferences(TEST, MODE_WORLD_READABLE);
editText.setText(pre.getString("text", ""));
}
@Override
public void onStop(){
super.onStop();
SharedPreferences.Editor editor = this.getSharedPreferences(TEST, MODE_WORLD_READABLE).edit();
editor.putString("text", editText.getText().toString());
editor.commit();
}
代码和上面的示例代码几乎一样,就不进行解释了!
第四步:看一下运行效果,首次运行程序,出现一个空的编辑框,这是因为text域的默认值是空的,所以刚开始啥也不显示,这个时候我们在上面输入一行字符串,然后退出程序,这个时候onStop()方法会被调用,保存刚刚编辑的字符串,再次运行程序的时候,我们就会调用onCreate()方法获取text域的值,并且显示再编辑框上,也就是获取我们上次编辑的字符串并进行显示!这里先来看看效果截图:
接下来我们看看运行着的模拟器的文件系统中是否有我们新建的那个test.xml文件,利用eclipse的文件浏览器,或者利用adb连接模拟器查看都可以:
好了,先到这里吧!