• android数据存储之sharedPreference


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

      

      

      源码中可以看到接口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

  • 相关阅读:
    Linux----------系统管理之释放内存
    阿里云OSS挂载到ECS(注意fuse版本,必须和源码对应)
    数据库图形化管理工具navicat
    linux集群管理工具clustershell
    记一次nginx启动报错
    虚拟化之KVM
    虚拟化之-XEN(未完待续)
    虚拟化
    Linux----------Jenkins基础
    Linux日常系统管理命令
  • 原文地址:https://www.cnblogs.com/SamSarah/p/4936874.html
Copyright © 2020-2023  润新知