1、android文件存储

        对Android系统了解的都知道,Android系统有四种基本的数据保存方法,一是SharedPreference,二是文件,三是SQLite,四是ContentProvider。看出来了吧,Preference,对就是使用SharedPreferneces以键值对的形式进行保存的。

2、SharedPreferneces

        做软件开发应该都知道,很多软件会有配置文件,里面存放这程序运行当中的各个属性值,由于其配置信息并不多,如果采用数据库来存放并不划算,因为数据库连接跟操作等耗时大大影响了程序的效率,因此我们使用键值这种一一对应的关系来存放这些配置信息。SharedPreferences正是Android中用于实现这中存储方式的技术。
        SharedPreferences是以键值对的形式存储数据的,其使用非常简单,能够轻松的存放数据和读取数据。

        在具体介绍Android的设置界面的实现之前,我们先来介绍一下预备知识,就是Android数据持久化方法中最简单的一种,即使用Preferences的键值对存储方式。这种方式主要用来存储比较简单的一些数据,而且是标准的Boolean、Int、Float、Long、String等类型。

        android.content.SharedPreferences是一个接口,用来获取和修改持久化存储的数据。有三种获取系统中保存的持久化数据的方式:

        1). public SharedPreferences getPreferences (int mode)
通过Activity对象获取,获取的是本Activity私有的Preference,保存在系统中的xml形式的文件的名称为这个Activity的名字,因此一个Activity只能有一个,属于这个Activity。
        2). public SharedPreferences getSharedPreferences (String name, int mode)
因为Activity继承了ContextWrapper,因此也是通过Activity对象获取,但是属于整个应用程序,可以有多个,以第一参数的name为文件名保存在系统中。
        3). public static SharedPreferences getDefaultSharedPreferences (Context context)
PreferenceManager的静态函数,保存PreferenceActivity中的设置,属于整个应用程序,但是只有一个,Android会根据包名和PreferenceActivity的布局文件来起一个名字保存。
        通过以上方式取得SharedPreferences后就可以对数据进行读取或者保存了。
        保存方式如下:

"Settings";   
 SharedPreferences settings = getSharedPreferences(STORE_NAME, MODE_PRIVATE);   
 SharedPreferences.Editor editor = settings.edit();   
"sourceType", 0);   
 editor.commit();

获得SharedPreferences,如果需要进行保存等修改操作,首先得通过其edit()方法获得SharedPreferences.Editor,然后就可以通过putInt、putString等方法以键值对(key-value)的方式保存数据,或者remove移除某个键(key),及调用clear方法删除所有内容。最后需要调用commit方法是使修改生效。
        读取方式如下:

SharedPreferences settings = getSharedPreferences(STORE_NAME, MODE_PRIVATE);   
int source = settings.getInt("sorceType",1);


读取就更加简单了,只要获得SharedPreferences后,就可以通过getInt、getString等方法获取对应键(key)保存着的数据,如果没有找到key,则返回第二个参数作为默认值。

2、PreferencesActivity

        在Android开发过程中我们有很大的机会需要用到参数设置功能,那么在Android应用中,我们如何实现参数设置界面及参数存储呢,下面我们来介绍一下Android中的一个特殊Activity–PreferencesActivity。
        PreferencesActivity是Android中专门用来实现程序设置界面及参数存储的一个Activity。

继承自PreferenceActivity的类  如果没有特别声明  一个项目即使有很多个这样的类  都保存在一个xml里面.即packagename_preference.xml里面。这个packagename_preference.xml属于整个应用



基本用法: 

1)存数据: 

//第一个参数是文件名,不需要加.xml后缀,如果文件不存在,系统会自动生成。 
//文件路径为:/data/data/<packagename>/shared_prefs/xxx.xml 



SharedPreferences sp = getSharedPreferences("loginsetting", MODE_PRIVATE);
String name = sp.getString("name", "");
String password = sp.getString("pwd", "");



2)取数据 



SharedPreferences sp = getSharedPreferences("loginsetting", MODE_PRIVATE);
String name = sp.getString("name", "");
String password = sp.getString("pwd", "");



其他: 
//getPreferences(mode)与getSharedPreferences(String filename,mode) 
//区别在于getPreferences只有一个参数,不能指定文件名,文件名固定为 
//当前Activity的名字,不包含包名。 



SharedPreferences sp = getPreferences(MODE_PRIVATE); 
Editor editor = sp.edit(); 
editor.putFloat("money", 100000.0f); 
editor.commit();



//通过PreferenceManager.getDefaultSharedPreferences(Context),获取到 
的SharedPreferences MODE默认为MODE_PRIVATE,而且生成文件名为 
<包名>_preferences.xml 



SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); 
Editor editor = sp.edit(); 
editor.putFloat("money", 100000.0f); 
editor.commit();



------------------三个mode

MODE_PRIVATE 私有的,不允许其他程序访问该xml文件。 
MODE_WORLD_READABLE 其他程序可以读取 
MODE_WORLD_WRITABLE 其他程序可以写

这里其他程序如何访问呢? 
有两种方式: 
第一种,在第二个程序中通过File: 



File f = new File("/data/data/包名/shared_prefs/xxx.xml"); 
FileInputStream fis = new FileInputStream(f);//在被访问程序中,MODE_WORLD_READABLE 
FileOutputStream fos = new FileOutputStream(f);//在被访问程序中,MODE_WORLD_WRITABLE



第二种,通过被访问程序的Context对象。 



Context otherContext = createPackageContext( 
"com.anjoyo.sharedpreference", CONTEXT_IGNORE_SECURITY);



第一个参数为要创建context的包名,第二个参数为创建时忽略安全问题。 



SharedPreferences sp = otherContext.getSharedPreferences 
("loginsetting", MODE_WORLD_READABLE); 
String name = sp.getString("name", ""); 
String pwd = sp.getString("pwd", "");



SharedPreference可以保存多个数据



sp = PreferenceManager.getDefaultSharedPreferences(this);



存: 



android preference 依赖另一个preference可不可用 安卓preference的用法_移动开发



SharedPreferences.Editor editor = sp.edit();
Set<String> set = new HashSet<String>();
set.add("java");
set.add("C++");
set.add("c");
editor.putStringSet("books", set);
editor.commit();



android preference 依赖另一个preference可不可用 安卓preference的用法_移动开发



取: 



Set<String> books = sp.getStringSet("books", null);