android数据存储之sharedPreference

时间:2021-07-26 05:35:01

  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>

  activity_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呢?而且这一步骤刚开始很容易被忘记,好奇之下,看看源码,一切迎刃而解

  android数据存储之sharedPreference

 android数据存储之sharedPreference 

  源码中可以看到接口SharedPreferences里面又定义了接口Editor这个抽象类,而抽象方法则都是在Editor里面,官方对Editor的说明是这样:Editor接口用于修改值的对象。你使editor发生了一定量数据的变化,且不是复制回原来的sharedPreferences的数据,直到你调用了commit()或者apply()。不管怎么样都记住那个抽象方法是在Editor这个抽象类中,就不会出错了。

  还有一个问题,为什么数据写完之后必须要调用commit()呢?而官方文档说或者是apply()呢?它们两个的区别又在哪里呢?

 android数据存储之sharedPreference

    首先代码块仍旧在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