在前一篇文章已经讲过Android的数据存储:SharedPreferences 详情请见: http://www.cnblogs.com/idayln/archive/2013/05/31/3110786.html .这篇文章发表之后,收到一些反馈,有同鞋就建议要把SharedPrefrences的数据共享性体现出来。因此今天就为此进行一些更新!!
- Q: SharedPreferences 如何体现数据共享?或者说如何才能读,写其它应用的SharedPreferences呢?
答:有二种方式可以访问并且进行读写其它应用的SharedPreferences.
- 对xml进行操作!这是由其特性决定! 因为SharedPreferences文件是统一存放在/data/data/your_package_name/shared_prefs目录,并且它的文件格式是xml,因此我们完全可以采用对xml解析的方式对它进行操作。此种与解析一般xml格式文件没有任何区别,会解析xml就行!这种方式比较繁琐并且不能体现SharedPreferences的优势,不推荐!
- 对创建的SharedPreferences指定权限,比如把mode设置为MODE_WORLD_READABLE,表明可以被其它程序读取,设置为MODE_WORLD_WRIATABLE,表明可以被其它程序写入。具体的步骤如下:
- 获其对应App的context。
Context anther_app = createPackageContext("your_app_package_name",int flags);
- 获得SharedPreferences对象。
SharedPreferences spfPreferences = anther_app.getSharedPreferences(fileName, int MODE);
- 接下来的操作就是单纯SharedPreferences方法的使用了,详情可以参照:http://www.cnblogs.com/idayln/archive/2013/05/31/3110786.html
- 获其对应App的context。
通常采用这种方式进行数据共享不推荐,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();
- 假如有个Person类(包含name,age,address属性)需要存储,可以分成三步:第一步就是把使用对象序列化技术对Person对象进行操作;第二步就是把它转换成Base64编码;第三步就是使用SharedPreferences.Editor对象并且调用putString方法。代码请见下方:
这种方法就是添加一层包装把对象转换成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);
- 文件存储的文件格式不必是xml,可以是任何扩展名;
- 文件存储在手机内存中,路径为:/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!