• Android的移动存储之SharedPreferences 定制存储LIST,图片


    在Android系统中提供了多种存储技术.通过这些存储技术可以将数据存储在各种存储介质上.比如sharedpreferences可以将数据保存着应用软件的私有存储区,这些存储区的数据只能被写入这些数据的软件读取.当然Android还支持文件存储、SQLite数据库和Content Provider。在这里我们将对sharedpreferences存储方式进行介绍。

    SharedPreferences是一种轻量级的数据存储方式,学过Web开发的同学,可以想象它是一个小小的Cookie。它可以用键值对的方式把简单数据类型(boolean、int、float、long和String)存储在应用程序的私有目录下(data/data/包名 /shared_prefs/)自己定义的xml文件中。

    SharedPreferences是以键值对来存储应用程序的配置信息的一种方式,它只能存储基本数据类型。一个程序的配置文件仅可以在本应用程序中使用,或者说只能在同一个包内使用,不能在不同的包之间使用。实际上sharedPreferences是采用了XML格式将数据存储到设备中,在DDMS中的File Explorer中的/data/data//shares_prefs下。

    一、获取SharedPreferences对象的方法

    (1)通过函数Context.getSharedPreferences(String name,int mode),其中name为本组件的配置文件名(如果想要与本应用程序的其他组件共享此配置文件,可以用这个名字来检索到这个配置文件),mode为操作模式,默认的模式为0或MODE_PRIVATE;返回值为SharedPreferences。

    (2)通过函数Activity.getPreferences(int mode),其中配置文件仅可以被调用的Activity使用。mode为操作模式,默认的模式为0或MODE_PRIVATE;返回值为SharedPreferences。

    二、使用SharedPreferences存取数据

    保存key-value对一般要指定一个文件名,然后用类似putString的方法指定key和value。SharedPreferences也采用了同样的方法。使用SharedPreferences保存key-value对的步骤如下:

    (1) 使用Activity类的getSharedPreferences方法获得SharedPreferences对象。其中存储key-value的文件名的名称由getSharedPreferences方法的第一个参数指定。

    (2) 使用SharedPreferences接口的edit获得SharedPreferences.Editor对象。

    (3) 通过SharedPreferences.Editor接口的putXXX方法保存key-value对。其中XXX表示value的不同数据类型。Boolean类型的value则是用putBoolean方法,字符串类型的则为putString方法。

    (4) 通过SharedPreferences.Editor接口的commit方法保存key-value对。Commit方法相当于数据库事务中的提交(commit)操作。只有在事件结束后进行提交,才会将数据真正保存在数据库中。保存key-value也是一样。

    三、数据的存储位置和格式

    SharedPreferences将数据文件写在手机内存私有的目录中。在模拟器中测试程序可以通过ADT的DDMS透视图来查看数据文件的位置。

    四、保存较为复杂的类型的数据

    前面介绍的SharedPreferences只能保存简单类型的数据,例如,string,int等。如果需要存取比较复杂的数据类型比如类或者图像,则需要对这些数据进行编码,通常将其转换成Base64编码,然后将转换后的数据以字符串的形式保存在XML文件中。

    SharedPreferences保存List集合

    public static String WeatherList2String(List<Weather> WeatherList)
    throws IOException {
    // 实例化一个ByteArrayOutputStream对象,用来装载压缩后的字节文件。
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    // 然后将得到的字符数据装载到ObjectOutputStream
    ObjectOutputStream objectOutputStream = new ObjectOutputStream(
    byteArrayOutputStream);
    // writeObject 方法负责写入特定类的对象的状态,以便相应的 readObject 方法可以还原它
    objectOutputStream.writeObject(WeatherList);
    // 最后,用Base64.encode将字节文件转换成Base64编码保存在String中
    String WeatherListString = new String(Base64.encode(
    byteArrayOutputStream.toByteArray(), Base64.DEFAULT));
    // 关闭objectOutputStream
    objectOutputStream.close();
    return WeatherListString;
    }

    @SuppressWarnings("unchecked")
    public static List<Weather> String2WeatherList(String WeatherListString)
    throws StreamCorruptedException, IOException,
    ClassNotFoundException {
    byte[] mobileBytes = Base64.decode(WeatherListString.getBytes(),
    Base64.DEFAULT);
    ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
    mobileBytes);
    ObjectInputStream objectInputStream = new ObjectInputStream(
    byteArrayInputStream);
    List<Weather> WeatherList = (List<Weather>) objectInputStream
    .readObject();
    objectInputStream.close();
    return WeatherList;
    }

    复制代码
    public static String WeatherList2String(List<Weather> WeatherList)
                throws IOException {
            // 实例化一个ByteArrayOutputStream对象,用来装载压缩后的字节文件。
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            // 然后将得到的字符数据装载到ObjectOutputStream
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(
                    byteArrayOutputStream);
            // writeObject 方法负责写入特定类的对象的状态,以便相应的 readObject 方法可以还原它
            objectOutputStream.writeObject(WeatherList);
            // 最后,用Base64.encode将字节文件转换成Base64编码保存在String中
            String WeatherListString = new String(Base64.encode(
                    byteArrayOutputStream.toByteArray(), Base64.DEFAULT));
            // 关闭objectOutputStream
            objectOutputStream.close();
            return WeatherListString;
        }
    
        @SuppressWarnings("unchecked")
        public static List<Weather> String2WeatherList(String WeatherListString)
                throws StreamCorruptedException, IOException,
                ClassNotFoundException {
            byte[] mobileBytes = Base64.decode(WeatherListString.getBytes(),
                    Base64.DEFAULT);
            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
                    mobileBytes);
            ObjectInputStream objectInputStream = new ObjectInputStream(
                    byteArrayInputStream);
            List<Weather> WeatherList = (List<Weather>) objectInputStream
                    .readObject();
            objectInputStream.close();
            return WeatherList;
        }
    复制代码

    SharedPreferences保存图片和可序列化的对象

    查看源代码
    package android.test.sharedpreferencescomplex;

    import java.io.Serializable;

    public class MobileInfo implements Serializable {

    private static final long serialVersionUID = 1L;
    public String name;
    public String infoString;

    }



    package android.test.sharedpreferencescomplex;

    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import android.os.Bundle;
    import android.app.Activity;
    import android.content.SharedPreferences;
    import android.content.SharedPreferences.Editor;
    import android.graphics.Bitmap.CompressFormat;
    import android.graphics.BitmapFactory;
    import android.graphics.drawable.Drawable;
    import android.util.Base64;
    import android.view.Menu;
    import android.view.View;
    import android.widget.ImageView;
    import android.widget.Toast;

    public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    }


    public void onclick_Write_Image(View v) throws Throwable {
    SharedPreferences sharedPreferences = getSharedPreferences("complex", Activity.MODE_PRIVATE);
    Editor editor = sharedPreferences.edit();
    ByteArrayOutputStream byteArrayOutputStream =new ByteArrayOutputStream();
    BitmapFactory.decodeResource(getResources(), R.drawable.image1).compress(CompressFormat.JPEG, 50, byteArrayOutputStream);
    String imageString = new String(Base64.encode(byteArrayOutputStream.toByteArray(),Base64.DEFAULT));
    editor.putString("image", imageString);
    editor.commit();
    byteArrayOutputStream.close();
    }

    public void onclick_Read_Image(View view) throws Throwable {
    SharedPreferences sharedPreferences = getSharedPreferences("complex",Activity.MODE_PRIVATE);
    String string = sharedPreferences.getString("image", "");
    byte[] imageBytes = Base64.decode(string.getBytes(), Base64.DEFAULT);
    ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(imageBytes);
    ImageView imageView =(ImageView)findViewById(R.id.imageView1);
    imageView.setImageDrawable(Drawable.createFromStream(byteArrayInputStream, "image"));
    byteArrayInputStream.close();

    }
    public void onclick_Write_Data(View view) throws Throwable
    {
    MobileInfo mobile = new MobileInfo();

    mobile.name = "魅族";
    mobile.infoString = "魅族MX";
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
    objectOutputStream.writeObject(mobile);
    SharedPreferences sharedPreferences = getSharedPreferences("complex", Activity.MODE_PRIVATE);
    Editor editor = sharedPreferences.edit();
    sharedPreferences = getSharedPreferences("complex",Activity.MODE_PRIVATE);
    String mobilesString = new String(Base64.encode(byteArrayOutputStream.toByteArray(),Base64.DEFAULT));
    editor.putString("mobile", mobilesString);
    editor.commit();
    objectOutputStream.close();
    }

    public void onclick_Read_Data(View view) throws Throwable, Throwable
    {

    SharedPreferences sharedPreferences = getSharedPreferences("complex", Activity.MODE_PRIVATE);
    String mobilesString = sharedPreferences.getString("mobile", "");
    byte[] mobileBytes = Base64.decode(mobilesString.getBytes(),Base64.DEFAULT);
    ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(mobileBytes);
    ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
    MobileInfo mobileInfo = (MobileInfo) objectInputStream.readObject();
    Toast.makeText(this,"手机品牌:" + mobileInfo.name + " 手机型号:" + mobileInfo.infoString,
    Toast.LENGTH_LONG).show();
    objectInputStream.close();


    }

    }

    复制代码
    查看源代码
     package android.test.sharedpreferencescomplex;
     
     import java.io.Serializable;
     
     public class MobileInfo implements Serializable {
     
     private static final long serialVersionUID = 1L;
     public String name;
     public String infoString;
     
     }
     
     
     
     package android.test.sharedpreferencescomplex;
     
     import java.io.ByteArrayInputStream;
     import java.io.ByteArrayOutputStream;
     import java.io.ObjectInputStream;
     import java.io.ObjectOutputStream;
     import android.os.Bundle;
     import android.app.Activity;
     import android.content.SharedPreferences;
     import android.content.SharedPreferences.Editor;
     import android.graphics.Bitmap.CompressFormat;
     import android.graphics.BitmapFactory;
     import android.graphics.drawable.Drawable;
     import android.util.Base64;
     import android.view.Menu;
     import android.view.View;
     import android.widget.ImageView;
     import android.widget.Toast;
     
     public class MainActivity extends Activity {
     
     @Override
     public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
     }
     
     
     public void onclick_Write_Image(View v) throws Throwable {
     SharedPreferences sharedPreferences = getSharedPreferences("complex", Activity.MODE_PRIVATE);
     Editor editor = sharedPreferences.edit();
     ByteArrayOutputStream byteArrayOutputStream =new ByteArrayOutputStream();
     BitmapFactory.decodeResource(getResources(), R.drawable.image1).compress(CompressFormat.JPEG, 50, byteArrayOutputStream);
     String imageString = new String(Base64.encode(byteArrayOutputStream.toByteArray(),Base64.DEFAULT));
     editor.putString("image", imageString);
     editor.commit();
     byteArrayOutputStream.close();    
     }
     
     public void onclick_Read_Image(View view) throws Throwable {
     SharedPreferences sharedPreferences = getSharedPreferences("complex",Activity.MODE_PRIVATE);
     String string = sharedPreferences.getString("image", "");
     byte[] imageBytes = Base64.decode(string.getBytes(), Base64.DEFAULT);
     ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(imageBytes);
     ImageView imageView =(ImageView)findViewById(R.id.imageView1);
     imageView.setImageDrawable(Drawable.createFromStream(byteArrayInputStream, "image"));
     byteArrayInputStream.close();
     
     }
     public void onclick_Write_Data(View view) throws Throwable
     {
     MobileInfo mobile = new MobileInfo();
     
     mobile.name = "魅族";
     mobile.infoString = "魅族MX";
     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
     ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
     objectOutputStream.writeObject(mobile);
     SharedPreferences sharedPreferences = getSharedPreferences("complex", Activity.MODE_PRIVATE);
     Editor editor = sharedPreferences.edit();
     sharedPreferences = getSharedPreferences("complex",Activity.MODE_PRIVATE);
     String mobilesString = new String(Base64.encode(byteArrayOutputStream.toByteArray(),Base64.DEFAULT));
     editor.putString("mobile", mobilesString);
     editor.commit();
     objectOutputStream.close();
     }
     
     public void onclick_Read_Data(View view) throws Throwable, Throwable
     {
     
     SharedPreferences sharedPreferences = getSharedPreferences("complex", Activity.MODE_PRIVATE);
     String mobilesString = sharedPreferences.getString("mobile", "");
     byte[] mobileBytes = Base64.decode(mobilesString.getBytes(),Base64.DEFAULT);
     ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(mobileBytes);
     ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
     MobileInfo mobileInfo = (MobileInfo) objectInputStream.readObject();
     Toast.makeText(this,"手机品牌:" + mobileInfo.name + "
    手机型号:" + mobileInfo.infoString,
     Toast.LENGTH_LONG).show();
     objectInputStream.close();
     
     
     }
     
     }
    复制代码

    五、设置数据文件的访问权限

    因为Android系统并不是完全的创新的操作系统,而是在linux内核基础上发展起来的一个移动操作系统,所以android还有一些linux的基本特性。我们用getsharedPreferences方法获得sharedpreferences对象,getsharedPreferences方法的第2个参数值使用到了Activity.MODE_PRIVATE常量。除了这个常量以外还可以使用另外3个常量。这4个常量用于指定文件的建立模式。他们一个重要的功能就是设置文件的属性,从而可以设置数据文件的访问权限。

    六、可以保存设置的Activity:PreferenceActivity

    由于SharedPreferences可以很容易的保存key-value对,因此,通常使用SharedPreferences保存配置信息。不过Android SDK提供了更为容易的方法来设计配置界面,并且可以透明地保存配置信息。这就是PreferenceActivity。

    PreferenceActivity是Activity的子类,该类封装了SharedPreferences。因此,PreferenceActivity的所有子类都拥有保存key-value对的能力。

    PreferenceActivity提供了一些常用的设置项,这些设置项可以满足大多数的配置界面的要求。与组件一样,这些配置项既可以从XML文件创建,也可以从代码创建。比较常用的有:

    • CheckboxPreference:对应标签。该设置项会创建一个CheckBox组件。
    • EditTextPreference:对应标签。单击该设置项会弹出一个带EditText组件的对话框。
    • ListPreference:对应标签。单击该设置项会弹出带ListView组件的对话框。

    推荐文章:http://www.cnblogs.com/ikarl/archive/2012/11/13/2768344.html

  • 相关阅读:
    Unity3d-UI插件EZGUI官方视频教程
    安装安卓模拟器和unity3d插件EZGUI
    NGUI的原理机制:深入剖析UIPanel,UIWidget,UIDrawCall底层原理
    分享我的2014年3月unity3d面试题与参考答案
    WP8持续集成之通过命令行跑单元测试
    深入学习HttpClient(一)扩展额外的功能
    Windows Phone实用教程:利用Blend为程序添加设计时数据
    WP架构设计(一)MVVM回顾
    Windows Phone Unit Test 环境搭建
    Caliburn Micro框架快速上手(WP)
  • 原文地址:https://www.cnblogs.com/myPersonalTailor/p/4980093.html
Copyright © 2020-2023  润新知