在Android中,数据存储是开发人员不可以避免的。Android为开发者提供了很多的存储方法,在前面的博客中,已经讲述了sqlite存储数据。今天将介绍用SharedPreferences来存储数据,它可以将数据保存在应用软件的私有存储区,存储区的数据只能被写入这些数据的软件读取。SharedPreference通过键值对的方法存储数据。
1.SharedPreference存储简单数据
SharedPreference可以存放简单的String、Boolean、Int等对象。
1 <RelativeLayout xmlns:tools="http://schemas.android.com/tools" 2 xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:paddingBottom="@dimen/activity_vertical_margin" 6 android:paddingLeft="@dimen/activity_horizontal_margin" 7 android:paddingRight="@dimen/activity_horizontal_margin" 8 android:paddingTop="@dimen/activity_vertical_margin" 9 tools:context=".MainActivity" > 10 11 <TextView 12 android:id="@+id/textView1" 13 android:layout_width="wrap_content" 14 android:layout_height="wrap_content" 15 android:text="姓名" /> 16 17 <EditText 18 android:id="@+id/editename" 19 android:layout_width="fill_parent" 20 android:layout_height="wrap_content" 21 android:layout_below="@id/textView1" /> 22 23 <TextView 24 android:id="@+id/textView2" 25 android:layout_width="wrap_content" 26 android:layout_height="wrap_content" 27 android:layout_alignLeft="@+id/editename" 28 android:layout_below="@+id/editename" 29 android:layout_marginTop="15dp" 30 android:text="兴趣爱好" /> 31 32 <EditText 33 android:id="@+id/editehoby" 34 android:layout_width="fill_parent" 35 android:layout_height="wrap_content" 36 android:layout_alignLeft="@+id/textView2" 37 android:layout_below="@+id/textView2" 38 android:layout_marginTop="21dp" 39 android:ems="10" > 40 41 <requestFocus /> 42 </EditText> 43 44 <CheckBox 45 android:id="@+id/checkBox1" 46 android:layout_width="wrap_content" 47 android:layout_height="wrap_content" 48 android:layout_alignLeft="@+id/editehoby" 49 android:layout_below="@+id/editehoby" 50 android:layout_marginTop="18dp" 51 android:text="是否工作" /> 52 53 <TextView 54 android:id="@+id/textView3" 55 android:layout_width="wrap_content" 56 android:layout_height="wrap_content" 57 android:layout_alignLeft="@+id/checkBox1" 58 android:layout_below="@+id/checkBox1" 59 android:layout_marginTop="22dp" 60 android:text="单位性质" /> 61 62 <RadioGroup 63 android:id="@+id/radioGroup1" 64 android:layout_width="wrap_content" 65 android:layout_height="wrap_content" 66 android:layout_alignLeft="@+id/textView3" 67 android:layout_below="@+id/textView3" 68 android:layout_marginTop="24dp" > 69 70 <RadioButton 71 android:id="@+id/radio0" 72 android:layout_width="wrap_content" 73 android:layout_height="wrap_content" 74 android:checked="true" 75 android:text="国营" /> 76 77 <RadioButton 78 android:id="@+id/radio1" 79 android:layout_width="wrap_content" 80 android:layout_height="wrap_content" 81 android:text="私营" /> 82 83 <RadioButton 84 android:id="@+id/radio2" 85 android:layout_width="wrap_content" 86 android:layout_height="wrap_content" 87 android:text="股份制" /> 88 </RadioGroup> 89 90 <Button 91 android:id="@+id/button1" 92 android:layout_width="wrap_content" 93 android:layout_height="wrap_content" 94 android:layout_alignBottom="@+id/radioGroup1" 95 android:layout_alignRight="@+id/editehoby" 96 android:layout_marginBottom="26dp" 97 android:layout_marginRight="30dp" 98 android:text="tiao" /> 99 100 </RelativeLayout>
这里定义了几个edittext。
1 protected void onStop() 2 { 3 //获得SharedPreference对象 4 SharedPreferences myShared=getSharedPreferences(PREFERENCE_NAME, Activity.MODE_PRIVATE); 5 //获得editor对象 6 SharedPreferences.Editor editor=myShared.edit(); 7 //添加需要保存的数据 8 editor.putString("name", edname.getText().toString()); 9 editor.putString("hobby", edhoby.getText().toString()); 10 editor.putBoolean("employee", cbcareer.isChecked()); 11 editor.putInt("companytype", rdCompanyType.getCheckedRadioButtonId()); 12 //提交数据 13 editor.commit(); 14 super.onStop(); 15 16 }
这对数据的存储,并没有放在单独的事件中,而是放在onstop方法中。当activity停止的时候,会自动提交数据。
1 protected void onCreate(Bundle savedInstanceState) { 2 super.onCreate(savedInstanceState); 3 setContentView(R.layout.activity_main); 4 edname=(EditText)findViewById(R.id.editename); 5 edhoby=(EditText)findViewById(R.id.editehoby); 6 cbcareer=(CheckBox)findViewById(R.id.checkBox1); 7 Button button=(Button)findViewById(R.id.button1); 8 button.setOnClickListener(new View.OnClickListener() { 9 10 @Override 11 public void onClick(View v) { 12 // TODO Auto-generated method stub 13 Intent intent=new Intent(); 14 intent.setClass(MainActivity.this, ProductSharedActivity.class); 15 startActivity(intent); 16 } 17 }); 18 rdCompanyType=(RadioGroup)findViewById(R.id.radioGroup1); 19 SharedPreferences sharedpre=getSharedPreferences(PREFERENCE_NAME, Activity.MODE_PRIVATE); 20 edname.setText(sharedpre.getString("name", "")); 21 edhoby.setText(sharedpre.getString("hobby", "")); 22 cbcareer.setChecked(sharedpre.getBoolean("employee",false)); 23 rdCompanyType.check(sharedpre.getInt("companytype", -1)); 24 25 }
数据读取与保存的方法类似。
2.SharedPreference保存复杂数据
SharedPreference不仅可以保存简单的数据,而且可以保存复杂的数据对象,比如对象、图像等。保存复杂的数据类型,需要对数据进行编码。对数据的保存方法和上面的基本一致
1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" > 5 6 <TextView 7 android:id="@+id/textView1" 8 android:layout_width="wrap_content" 9 android:layout_height="wrap_content" 10 android:layout_alignParentLeft="true" 11 android:layout_alignParentTop="true" 12 android:layout_marginLeft="16dp" 13 android:layout_marginTop="15dp" 14 android:text="产品ID" /> 15 16 <EditText 17 android:id="@+id/txtID" 18 android:layout_width="wrap_content" 19 android:layout_height="wrap_content" 20 android:layout_alignLeft="@+id/textView1" 21 android:layout_below="@+id/textView1" 22 android:layout_marginTop="25dp" 23 android:ems="10" > 24 25 <requestFocus /> 26 </EditText> 27 28 <TextView 29 android:id="@+id/textView2" 30 android:layout_width="wrap_content" 31 android:layout_height="wrap_content" 32 android:layout_alignLeft="@+id/txtID" 33 android:layout_below="@+id/txtID" 34 android:layout_marginTop="18dp" 35 android:text="产品名称" /> 36 37 <EditText 38 android:id="@+id/txtName" 39 android:layout_width="wrap_content" 40 android:layout_height="wrap_content" 41 android:layout_alignLeft="@+id/textView2" 42 android:layout_below="@+id/textView2" 43 android:layout_marginTop="32dp" 44 android:ems="10" /> 45 46 <TextView 47 android:id="@+id/textView3" 48 android:layout_width="wrap_content" 49 android:layout_height="wrap_content" 50 android:layout_alignLeft="@+id/txtName" 51 android:layout_centerVertical="true" 52 android:text="产品价格" /> 53 54 <EditText 55 android:id="@+id/txtprice" 56 android:layout_width="wrap_content" 57 android:layout_height="wrap_content" 58 android:layout_alignLeft="@+id/textView3" 59 android:layout_below="@+id/textView3" 60 android:layout_marginTop="28dp" 61 android:ems="10" /> 62 63 <ImageView 64 android:id="@+id/imageView1" 65 android:layout_width="wrap_content" 66 android:layout_height="wrap_content" 67 android:layout_below="@+id/txtprice" 68 android:layout_toRightOf="@+id/textView3" /> 69 70 <Button 71 android:id="@+id/button1" 72 android:layout_width="wrap_content" 73 android:layout_height="wrap_content" 74 android:layout_alignRight="@+id/textView3" 75 android:layout_below="@+id/imageView1" 76 android:layout_marginTop="34dp" 77 android:text="选择图像" /> 78 79 </RelativeLayout>
后台代码:
1 protected void onStop() 2 { 3 Product product=new Product(); 4 /*product.setID(edid.getText().toString()); 5 product.setName(edname.getText().toString()); 6 product.setPrice(edprice.getText().toString());*/ 7 product.productname=edname.getText().toString(); 8 product.productid=edid.getText().toString(); 9 product.productprice=edprice.getText().toString(); 10 11 ByteArrayOutputStream baos=new ByteArrayOutputStream(); 12 ObjectOutputStream oos; 13 ((BitmapDrawable)imageview.getDrawable()).getBitmap().compress(CompressFormat.JPEG, 50, baos); 14 String imagebase=new String(Base64.encode(baos.toByteArray(), Base64.DEFAULT)); 15 try { 16 oos = new ObjectOutputStream(baos); 17 oos.writeObject(product); 18 } catch (IOException e) { 19 // TODO Auto-generated catch block 20 e.printStackTrace(); 21 }; 22 //获得SharedPreference对象 23 SharedPreferences myshared=getSharedPreferences("base64", Activity.MODE_PRIVATE); 24 String productbase=new String(Base64.encode(baos.toByteArray(),Base64.DEFAULT)); 25 //获得editor对象 26 SharedPreferences.Editor editor=myshared.edit(); 27 //添加需要存储的数据 28 editor.putString("product", productbase); 29 editor.putString("productimage", imagebase); 30 //提交保存数据 31 editor.commit(); 32 33 super.onStop(); 34 }
这里需要保存的数据都经过了base64的编码处理,在编码之前需要将其转为流的形式。