Saving Data
http://www.cnblogs.com/gcg0036/p/4321278.html
Saving Key-Value Sets:
如果想保存一个相对较小的key-values集合,可以使用 SharedPreferences API. SharedPreferences对象指向包含key-value对的文件,并且提供简单的读写方式。每个SharedPreferences文件均由框架管理,私人或共享均可使用。
可以保存任何简单类型的数据:boolean、float、int、long 和 string 。 这些数据是持久保存的,可以跨越用户会话(即使应用程序被杀死了也没关系)。
您可以创建新的共享首选项文件,或者采取两种方式之一来调用现有文件。
- getSharedPreferences() 如果需要用到多个配置文件,就用这个方法,第一个参数指定了文件的名称。你可以从应用程序的任何 Context调用这一函数。
- getPreferences() 如果只需为 Activity 定义一个配置文件,就用本方法。。因为该文件对于 Activity 而言是唯一的,所以不需要命名。
Context context = getActivity(); SharedPreferences sharedPref = context.getSharedPreferences( getString(R.string.preference_file_key), Context.MODE_PRIVATE);
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
读取,可以使用getInt() 、 getString()等调用方法来提供你想要的关键值,当键不存在时会返回某个默认值
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); int defaultValue = getResources().getInteger(R.string.saved_high_score_default); long highScore = sharedPref.getInt(getString(R.string.saved_high_score), defaultValue);
写入,需要调用SharedPreferences上的edit()来创建SharedPreferences.Editor,然后调用commit()来保存
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPref.edit(); editor.putInt(getString(R.string.saved_high_score), newHighScore); editor.commit();
Saving Files
File 对象适用于在start-to-finish读取或写入大量数据,File对象适合于读取或者写入大量数据
- 始终可用。
- 保存的文件只能用于默认应用程序。
- 当用户卸载应用程序时,系统会从内部存储删除应用程序所有文件。
- 由于用户可以安装外部存储作为USB存储,并且在某些情况下可以从设备中移除,所以外部存储并不总是可用的。
- 具有全局可读性,所以保存的文件可能被控制范围外的人读取。
- 用户想要卸载应用程序,只有当 应用程序文件保存在getExternalFilesDir()目录时系统才会删除应用程序文件。
要写入外部存储,就必须在 manifest file中请求 WRITE_EXTERNAL_STORAGE的权限。
<manifest ...> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ... </manifest>
内部存储文件不需要任何权限。应用程序始终有权在其内部存储目录读取及写入文件。
注意: 自 Android 4.4 开始,如果只是读写应用程序私有的文件,则不再需要申请上述权限了。
在内部存储保存文件
String filename = "myfile"; String string = "Hello world!"; FileOutputStream outputStream; try { outputStream = openFileOutput(filename, Context.MODE_PRIVATE); outputStream.write(string.getBytes()); outputStream.close(); } catch (Exception e) { e.printStackTrace(); }
如果需要缓存文件,就应该使用createTempFile()。例如从URL中提取文件名并且在应用程序内部缓存目录创建文件,方法如下:
public File getTempFile(Context context, String url) { File file; try { String fileName = Uri.parse(url).getLastPathSegment(); file = File.createTempFile(fileName, null, context.getCacheDir()); catch (IOException e) { // Error while creating file } return file; }
在外部存储保存文件
/* Checks if external storage is available for read and write */ public boolean isExternalStorageWritable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { return true; } return false; } /* Checks if external storage is available to at least read */ public boolean isExternalStorageReadable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { return true; } return false; }
- 尽管外部存储可以由用户和其他应用程序进行修改,有两类文件可以在外部存储:
- 公共文件
- 其他应用程序和用户可以自由访问该文件。卸载应用程序时,用户仍然可以使用这些文件。例如从应用程序或者其他下载文件获得的照片。
- 私密文件
- 卸载应用程序时,属于该应用程序的私密文件应该删除。尽管从技术角度由于外部存储,用户和其他应用程序可以访问这些文件。用户卸载应用程序时,系统会删除应用程序外部私密目录中的所有文件。
- 例如应用程序或者临时媒体文件下载的其他资源。
public File getAlbumStorageDir(String albumName) { // Get the directory for the user's public pictures directory. File file = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES), albumName); if (!file.mkdirs()) { Log.e(LOG_TAG, "Directory not created"); } return file; }
public File getAlbumStorageDir(Context context, String albumName) { // Get the directory for the app's private pictures directory. File file = new File(context.getExternalFilesDir( Environment.DIRECTORY_PICTURES), albumName); if (!file.mkdirs()) { Log.e(LOG_TAG, "Directory not created"); } return file; }
使用API常量比如DIRECTORY_PICTURES提供的目录名称是很重要的。这些目录名称确保系统可以适当处理文件。例如保存在 DIRECTORY_RINGTONES的文件由系统媒体扫描来进行铃声分类而不是音乐分类.
getFreeSpace() 和 getTotalSpace()可以找出是否有足够的可用空间
删除文件可以是delete()。deleteFile()来请求Context定位和删除文件
- 注意:用户卸载应用程序时,安卓系统会删除以下内容:
- 内部存储的所有文件。
- 使用 getExternalFilesDir()外部存储的所有文件。
- 然而你要手动删除getCacheDir() 定期创建的所有缓存文件,同时定期删除其他不需要的文件。