Saving Data
Saving Key-Value Sets
处理SharedPreferences
- 可以通过调用一以下两种方法中的一种,创建一个shared preference文件或者访问已经存在的
- getSharedPreferences():可以从你App中的任何上下文调用此方法
- getPreference():从Activity中调用这个方法,因为会访问属于这个activity的默认的preference文件,所以你不需要提供名字
-
Context context = getActivity();
SharedPreferences sharedPref = context.getSharedPreferences(
getString(R.string.preference_file_key), Context.MODE_PRIVATE); - 通过资源string文件R.string.preference_file_key访问shared preferences,使用只能被你app才能访问的私有模式启用它
- 如果你以MODE_WORLD_READABLE 或 MODE_WORLD_WRITEABLE创建一个shared preferences file,其他任何app只要知道文件标识符便能访问你的数据
写进SharedPreferences
- 为了写进shared preferences file,用你的SharedPreferences调用edit()来创建一个 SharedPreferences.Editor
将你想写入的键和值传入方法中,比如putInt() and putString(),然后调用commit()保存更改
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPref.edit(); editor.putInt(getString(R.string.saved_high_score), newHighScore); editor.commit();
读取SharedPreferences
从一个 shared preferences file来检索值,调用例如getInt() and 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);
保存文件
选择内部或者外部存储
- 所有的Android设备都有内部存储和外部存储两个存储区域
内部存储
- 总是可用
- 保存的文件默认情况下仅能被你的app所访问
- 当用户卸载app,系统讲从内部存储移除你所有的app文件
- 当你不想让用户或其他应用访问时,使用内部存储是最好的方式
外部存储
- 并不总是可用
- 全局可读
- 当用户卸载app,系统只会移除你用getExternalFilesDir()保存的文件
- 不需要访问限制,想和其他app分享数据或者让使用者用电脑访问时,外部存储将是最好的文件保存路径
尽管app默认安装在内部存储空间,但你可以通过在清单文件指定android:installLocation属性来设置存储路径
获取访问外部存储的权限
为了写入外部存储,你必须在清单文件中请求WRITE_EXTERNAL_STORAGE权限
<manifest ...> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ... </manifest>
你不需要申请内部存储的权限,因为你的应用总有读写它内部存储的权限
将文件保存到内部存储
- 通过调用getFilesDir()和getCacheDir()来获取合适的路径
- getCacheDir():系统当以低内存运行时,将可能不经提醒删除你的缓存文件
调用openFileOutput()得到FileOutputStream将文件写入到你的内部存储中
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()
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; }
将文件保存到外部存储
因为外部存储不一定是可用的,所以你必须通过调用getExternalStorageState()来判断外部存储的状态,如果返回的状态等同于MEDIA_MOUNTED,那么你可以读写你的文件
/* 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; }
- 当用户卸载程序时,公有文件将被保留,私有文件将被系统自动删除
如果你想要保存共有文件,使用getExternalStoragePublicDirectory()
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; }
如果你想要保存私有文件,那可以使用getExternalFilesDir()
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,将会确保这些文件被系统合理地处理
查询可用空间
- 你可以调用 getFreeSpace() or getTotalSpace()来获取可用的存储空间和总共的存储空间
删除文件
- myFile.delete();
- 如果文件保存在内部存储,可以通过请求上下文Context调用deleteFile()来删除一个文件