首页 > 代码库 > Android学习之简单的数据存储

Android学习之简单的数据存储

在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>
main.xml

这里定义了几个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             @Override11             public void onClick(View v) {12                 // TODO Auto-generated method stub13                 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     <EditText17         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     <TextView29         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     <EditText38         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     <TextView47         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     <EditText55         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     <ImageView64         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     <Button71         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>
base.xml

后台代码:

 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 block20             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的编码处理,在编码之前需要将其转为流的形式。