• 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者交流!群成员职业不限,程序员居多,讨论主题不限:技术分享,生活感悟,职场心得,时事分析...

  • 相关阅读:
    李超线段树 [Heoi2013]Segment
    [置顶] 九月半集训总结
    [置顶] 我想学学
    图论+前缀和 任(duty)
    模拟 飞(fly)
    入坑 可持久化线段树——主席树
    一次爆炸的联考
    HASH+平衡树 [JSOI2008]火星人prefix
    乱搞+STL平衡树 序列
    数学+图论 建造游乐场
  • 原文地址:https://www.cnblogs.com/idayln/p/3114497.html
Copyright © 2020-2023  润新知