Android的数据存储共分为5种
①SharedPreferences (当前应用的路径下)
②内部存储 (当前应用的路径下)
③外部存储 -sdCard
④Sqlite Android自带的一个轻量级数据库
⑤网络存储 连接到服务器 ----将数据上传到服务器
其实归根结底,为一种,都以文件形式保存的!先说第一种如何用SharedPreferences保存数据
sharedPreferences用于保存简单的数据类型 (ps:没人会不知道,就不写了)
存储的步骤:
1 SharedPreferences.Editor edit = sharedPreferences.edit();
2 edit.putString("name", et_text.getText().toString());
3 edit.commit();
读取的步骤:
1 SharedPreferences sf = getSharedPreferences("SamSarah", MODE_PRIVATE);
2 // getString(String key, String defValue) 设置默认值为null
3 tv_showValue.setText(sf.getString("name", null));
关键代码如上
注意:使用了Editor之后,一定要commit(),为什么?如果不commit()的话,写入的数据无效,也就不会将此次变化写入内存,硬盘。
下面贴一个简单的demo
activity_main.xml
1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 xmlns:tools="http://schemas.android.com/tools"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 tools:context=".MainActivity" >
6
7 <EditText
8 android:id="@+id/et_text"
9 android:layout_width="fill_parent"
10 android:layout_height="wrap_content"
11 android:layout_alignParentLeft="true"
12 android:layout_alignParentTop="true"
13 android:ems="10" >
14
15 <requestFocus />
16 </EditText>
17
18 <Button
19 android:id="@+id/btn_save"
20 android:layout_width="fill_parent"
21 android:layout_height="wrap_content"
22 android:layout_alignParentLeft="true"
23 android:layout_below="@+id/et_text"
24 android:text="保存数据" />
25
26 <Button
27 android:id="@+id/btn_delete"
28 android:layout_width="fill_parent"
29 android:layout_height="wrap_content"
30 android:layout_alignParentLeft="true"
31 android:layout_below="@+id/btn_save"
32 android:text="删除数据" />
33
34 <Button
35 android:id="@+id/btn_jump"
36 android:layout_width="fill_parent"
37 android:layout_height="wrap_content"
38 android:layout_alignParentLeft="true"
39 android:layout_below="@+id/btn_delete"
40 android:text="跳转" />
41
42 </RelativeLayout>
showvalue.xml
1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 xmlns:tools="http://schemas.android.com/tools"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent" >
5
6 <TextView
7 android:id="@+id/tv_showValue"
8 android:layout_width="wrap_content"
9 android:layout_height="wrap_content"
10 android:text="@string/hello_world" />
11
12 </RelativeLayout>
MainActivity.java
1 public class MainActivity extends Activity implements OnClickListener {
2
3 private EditText et_text;
4 private Button btn_save;
5 private Button btn_delete;
6 private Button btn_jump;
7 private SharedPreferences sharedPreferences;
8
9 @Override
10 protected void onCreate(Bundle savedInstanceState) {
11 super.onCreate(savedInstanceState);
12 initView();
13 }
14
15 private void initView() {
16 requestWindowFeature(Window.FEATURE_NO_TITLE);
17 setContentView(R.layout.activity_main);
18 // sharedPreferences保存简单的数据类型,(key,value)
19 sharedPreferences = this.getSharedPreferences("SamSarah", MODE_PRIVATE);
20 et_text = (EditText) findViewById(R.id.et_text);
21 btn_save = (Button) findViewById(R.id.btn_save);
22 btn_delete = (Button) findViewById(R.id.btn_delete);
23 btn_jump = (Button) findViewById(R.id.btn_jump);
24 btn_save.setOnClickListener(this);
25 btn_delete.setOnClickListener(this);
26 btn_jump.setOnClickListener(this);
27
28 }
29
30 @Override
31 public void onClick(View v) {
32 switch (v.getId()) {
33 case R.id.btn_save:
34 SharedPreferences.Editor edit = sharedPreferences.edit();
35 edit.putString("name", et_text.getText().toString());
36 edit.commit();
37 Toast.makeText(this, "数据保存成功", Toast.LENGTH_SHORT).show();
38 break;
39 case R.id.btn_delete:
40 SharedPreferences.Editor editD = sharedPreferences.edit();
41 editD.remove("name");
42 editD.commit();
43 Toast.makeText(this, "数据删除成功", Toast.LENGTH_SHORT).show();
44
45 break;
46 case R.id.btn_jump:
47 Intent intent = new Intent(MainActivity.this, showData.class);
48 startActivity(intent);
49 break;
50
51 default:
52 break;
53 }
54 }
55 }
showData.java
1 public class showData extends Activity {
2 private TextView tv_showValue;
3
4 @Override
5 protected void onCreate(Bundle savedInstanceState) {
6 super.onCreate(savedInstanceState);
7 initView();
8
9 }
10
11 private void initView() {
12 requestWindowFeature(Window.FEATURE_NO_TITLE);
13 setContentView(R.layout.activity_showvalue);
14 tv_showValue = (TextView) findViewById(R.id.tv_showValue);
15 SharedPreferences sf = getSharedPreferences("SamSarah", MODE_PRIVATE);
16 // getString(String key, String defValue) 设置默认值为null
17 tv_showValue.setText(sf.getString("name", null));
18
19 }
20 }
但是事情远没有结束,我们要善于给自己问问题,那么为什么要用sharedPreferences的时候要拿到Editor呢?而且这一步骤刚开始很容易被忘记,好奇之下,看看源码,一切迎刃而解
源码中可以看到接口SharedPreferences里面又定义了接口Editor这个抽象类,而抽象方法则都是在Editor里面,官方对Editor的说明是这样:Editor接口用于修改值的对象。你使editor发生了一定量数据的变化,且不是复制回原来的sharedPreferences的数据,直到你调用了commit()或者apply()。不管怎么样都记住那个抽象方法是在Editor这个抽象类中,就不会出错了。
还有一个问题,为什么数据写完之后必须要调用commit()呢?而官方文档说或者是apply()呢?它们两个的区别又在哪里呢?
首先代码块仍旧在Editor里面 ,没有指定访问权限,默认的就是public,但是返回值commit()方法是boolean,apply()方法是void,好像明白了点什么,那就继续往下:
①既然返回值不同,又都可以提交修改数据,就暗含commit提交成功的时候会返回true,失败的时候会返回false;而apply并不会
②官方说明,apply是先将数据原子写入内存,后异步写入硬盘。而commit是同步提交到硬件资源中。因此在多个并发的提交commit的时候,它们会等待处理当前的commit保存到磁盘后再进行操作,从而降低了效率。而apply只是原子的提交内容,后面又调用apply的函数将会直接覆盖前面的内存数据,从效率上来讲比commit好很多。
在一个进程中Sharedpreferences是单实例,一般不会出现并发冲突,如果对提交结果不关心,建议使用apply;如果关心提交结果,则使用commit。
代码托管:https://github.com/SamSarah1/Android-Demo