Android提供了多种方式(XML文件方式、文件方式、数据库方式等)进行数据的存储。开发者可以根据数据类型和设计的需要,选择适当的存储方式进行数据存储。
1.XML文件管理
XML文件更多的是用来维护应用或系统的配置文件。在Android中,goole提供了SharedPreferences这个轻型的存储类作为XML文件存储的上层接口,其本质上就是<ket, value>值对。
根据配置信息是否对其他应用开放,SharedPreferences提供了MODE_PRIVATE.、MODE_WORLD_READABLE两种权限。SharedPreferences的操作分为获取配置信息和存储配置信息两种方式。下面是获取配置信息的方法:
SharedPreferences settings=getSharedPreferences(PREFS_NAME,MODE_PRIVATE);
boolean silent=settings.getBoolean("silentMode", false);
存储配置信息和获取配置信息略有不同,下面是存储配置信息的方法:
SharedPreference settings=getShatedPreferences(PREFS_NAME, MODE_PRIVATE);
SharedPreference.Editor editor=settings.edit(); //获得编辑器
editor.putBoolean("silentMode", mSilentMode);
editor.commit(); //提交
如果希望配置信息对其他应用开发,在设置权限时,可使用MODE_WORLD_READABLE。在其他应用希望获取相应的配置信息时,必须先获取相应的上下文,方法如下:
context=createPackageContext("com.miaozl.text", Context.CONTEXT_IGNORE_SECURITY);
if(context != null){
SharedPreference settings=context.getSharedPreference(PREFS_NAME,Context.MODE_WORLD_READABLE);
mTest=settings.getString("text", null);
}
需要说明的是,在PreferenceActivity中内置了对SharedPreferences的支持。
如果希望ListPreference保存或查看当前的选择,可以调用的ListPreferences方法如下:
public void setValue(String value) //对应“android:entries”属性的值
public void setValueIndex(int index) //对应“android:entryValues”属性的值
public String getValue()
其他的Preference的操作方法类似于ListPreference。
2.内部文件管理
对于二进制数据,Android提供了内部存储的方式,开发者可以将数据存储在应用的私有空间中,避免其他程序的访问,内部存储的数据会在应用卸载时删除。
内部存储的实现非常简单,其权限包括MODE_PRIVATE、MODE_APPEND、MODE_WORLD_READABLE、MODE_WORLD_WRITEABLE等。
内部存储所在目录为\data\data\com.company.packagename\files。如果文件名为wors,其内部存储的目录为\data\data\com.android.mms\files\words。
(1)写入数据
写入字符串数据的方法:
FileOutputStream out=context.openFileOutput(file,Context.MODE_WORLD_WRITEABLE);
out.write(captureArray.toString().getBytes());
out.close();
写入结构体数据的方法:
private static void writeConfiguration(Context context, LocaleConfiguration configuration){
DataOutputStream out = null;
out=new DataOutputStream(context.openFileOutput(PREFERENCES, MODE_PRIVATE));
out.writeUTF(configuration.locale);
out.writeInt(configuration.mcc);
out.writeInt(configuration.mnc);
out.flush();
}
(2)读取数据
读取字符串数据的方法:
StringBuilder sb=new StringBuilder();
FileInputStream words=context.openFileInput("word");
int c;
while((c=words.read()) != -1){
if(c==‘\r‘ || c==‘\n‘){
String word=sb.toString().trim();
if(word.length() > 0){
mWord.add(word);
}
sb.setLength(0);
}else{
sb.append((char)c);
}
}
words.close();
mWordCount=mWords.size();
读取数据结构数据的方法:
private static void readConfiguration(Context context, LocaleConfiguration configuration){
DataInputStream in=null;
in=new DataInputStream(context.openFileInput(PREFERENCES));
configuration.locale=in,readUTF();
configuration.mcc=in.readInt();
configuration.mnc=in.readInt();
in.close();
对于应用携带的静态数据,可以放置在应用的assets目录或res、raw目录下。
对于assets目录下的静态数据,存在单个文件最大仅支持1MB的局限,读取方式:InputStream is=getAssets().open("read_asset.txt");
对于res、raw目录下的静态数据,读取方式:InputStream.inputStream=resources.openRawResource(R.raw.definitions);
Android还对创建缓存提供了支持,通过getCacheDir()可以获取应用的缓存路径。在系统可用空间不足时,Android会清空缓存,但对于开发者而言,不应维护过多的缓存。和内部存储一样,在应用卸载时,会清空并删除缓存目录。
3.外部文件管理