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