Android开发之SharedPreferences扩展以及File

  在前一篇文章已经讲过Android的数据存储:SharedPreferences 详情请见: http://www.cnblogs.com/idayln/archive/2013/05/31/3110786.html .这篇文章发表之后,收到一些反馈,有同鞋就建议要把SharedPrefrences的数据共享性体现出来。因此今天就为此进行一些更新!!

  1. Q: SharedPreferences 如何体现数据共享?或者说如何才能读,写其它应用的SharedPreferences呢?

答:有二种方式可以访问并且进行读写其它应用的SharedPreferences.

    1. 对xml进行操作!这是由其特性决定! 因为SharedPreferences文件是统一存放在/data/data/your_package_name/shared_prefs目录,并且它的文件格式是xml,因此我们完全可以采用对xml解析的方式对它进行操作。此种与解析一般xml格式文件没有任何区别,会解析xml就行!这种方式比较繁琐并且不能体现SharedPreferences的优势,不推荐!
    2. 对创建的SharedPreferences指定权限,比如把mode设置为MODE_WORLD_READABLE,表明可以被其它程序读取,设置为MODE_WORLD_WRIATABLE,表明可以被其它程序写入。具体的步骤如下:
      1. 获其对应App的context。
        Context anther_app = createPackageContext("your_app_package_name",int flags);
      2. 获得SharedPreferences对象。
        SharedPreferences  spfPreferences = anther_app.getSharedPreferences(fileName, int MODE);
      3. 接下来的操作就是单纯SharedPreferences方法的使用了,详情可以参照:http://www.cnblogs.com/idayln/archive/2013/05/31/3110786.html 

通常采用这种方式进行数据共享不推荐,Android专门提供一套API来用于数据共享:ContentProvide  这个以后在讲。

  2. Q: SharedPreferences默认只能存储基本数据类型及String或Set,可以存储复杂的对象数据类型吗?

答:可以。 SharedPreferences默认之所以只能存储基本数据类型及String或Set,是因为它提供的putXXX系列方法有限,如果要存复杂类型的数据,可以这样操作。

    • 假如有个Person类(包含name,age,address属性)需要存储,可以分成三步:第一步就是把使用对象序列化技术对Person对象进行操作;第二步就是把它转换成Base64编码;第三步就是使用SharedPreferences.Editor对象并且调用putString方法。代码请见下方:
       1 Person p = new Person();
       2 p.setName("dylan");
       3 p.setAge(24);
       4 p.setAddress("China");
       5 
       6 ByteArrayOutputStream baos = new ByteArrayOutputStream();
       7 ObjectOutputStream oos = new ObjectOutputStream(baos);
       8 oos.writeObject(p);
       9 
      10 SharedPreferences spfPreferences = getSharedPreferences(fileName, MODE_PRIVATE);
      11 //把Person转换成byte数组。
      12 String p_base64 = new String(Base64.encodeBase64(baos.toByteArray()));
      13 
      14 SharedPreferences.Editor editor = spfPreferences.edit();
      15 editor.putString("person",p_base64);
      16 editor.commit();

  这种方法就是添加一层包装把对象转换成byte数组并且进行Base64编码,到最后还是调用了putString方法。

文件的存储:

  文件的存储很简单,基本上就是IO流的操作,查看此文了解IO流:http://www.cnblogs.com/idayln/archive/2013/05/27/3102810.html

  文件的存储需要这二个类: InputStream,OutputStream

1 InputStream ins = openFileInput(String filename) ;
2 // filename: The name of the file to open; can not contain path separators
3 
4 OutputStream ons = openFileOutput(String filename,int mode);
  1. 文件存储的文件格式不必是xml,可以是任何扩展名;
  2. 文件存储在手机内存中,路径为:/data/data/your_package_name/files目录。

我们知道手机内存存储是有限的,那么如何存放在SDCard中去呢?

  1. 判断手机是否安装sdcard。如果返回true,则有安装!!!

 Environment.getExternalStorageState.equals(Environment.MEDIA_MOUNTED);

  2. 为AndroidManifest.xml添加uses-permission

  3. Environment.getExternalStorageDirectory获取SD卡的目录;也可以使用:/mnt/sdcared

    Note: /mnt目录: linux默认挂载外部设备都会挂到这个目录下面,如将sd卡挂载上去后,会生成一个/mnt/sdcard 目录。有时候会看到/sdcard目录,其实这个目录与/mnt/sdcard目录是一样的,因为/sdcard是个软链接(类似Windows的桌面快捷方式)而以;

  4. 完全的IO流操作。

Android 之SQLite 基础篇:http://www.cnblogs.com/idayln/archive/2013/06/04/3118024.html






【Dylan童鞋】

关注Dylan童鞋,请搜索微信号:DylanTongXue 。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Q群:315858410. 此群用于关注DylanTongXue者交流!群成员职业不限,程序员居多,讨论主题不限:技术分享,生活感悟,职场心得,时事分析...

原文地址:https://www.cnblogs.com/idayln/p/3114497.html