Android学习--《数据的保存》
16lz
2021-01-26
概述
Android的数据保存可以分为3种情况
- 保存在preference (小的键值对集合)
- 保存在文件 (流式顺序数据,如图片文件,网络交换的数据等)
- 保存到数据库DB
保存在Perference
两种方法:
getSharedPerference() 多个shared perference文件
Context context = getActivity();SharedPreferences sharedPref = context.getSharedPreferences( getString(R.string.preference_file_key), Context.MODE_PRIVATE);
getPerference() 当activity只需要一个sp文件的时候,此时不需要文件名
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
读写 Perference
读
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), default); // default 是作为查找的key不存在的时候的返回值
写
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);SharedPreferences.Editor editor = sharedPref.edit();editor.putInt(getString(R.string.saved_high_score), newHighScore);editor.commit(); //注意:最后要commit()
保存的位置
也就是保存在Flie systen,通过 Flie 的读写Apis
而android中有两个文本存储区域,这是因为android大都有两个存储位置,一个是不可变的 *internal storage,而另外一部分是可拆卸的 external storage (虽然现在有一些的设备将 internal 和external都做成了不可拆卸),但是还是有逻辑区分的
以下是总结的internal和external的区别的联系
位置 | 可用性 | 访问性 | 卸载后 | 权限 |
---|---|---|---|---|
internal | 总是可用的 | 只能被自己的app访问 | 系统会清理app内所有的相关文件 | 无需权限 |
external | 并不总是可用的(可能是外部sd卡) | 可以被其他的app访问到 | 卸载后只删除external根目录下的相关文件? | 要在mainfest里声明读写权限 |
internal 存储
// 这是在目录下创建一个文件File file = new File(context.getFilesDir(), filename);//这是通过outputstream写入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();}//最后这个很重要,是如何缓存文件的,其实绝大多多数情况下我们都要用到缓存的,视频缓存,图片缓存等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;}
external 存储
因为其可用性不一定,所以保存文件前一定要先进行可用性测试
//测试是否可读写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 flie 卸载时不可删除
public File getAlbumStorageDir(String albumName) { // Get the directory for the user's public pictures directory. File file = new File(Environment.getExternalStoragePublicDirectory( //要通过这个方法获取file Environment.DIRECTORY_PICTURES), albumName); //要制定类型 if (!file.mkdirs()) { Log.e(LOG_TAG, "Directory not created"); } return file;}
private file 在app卸载时刻删除
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); //这里指定类型很重要,如果指定的不是picture而是miuce,那么久不会被视为picture对待 if (!file.mkdirs()) { Log.e(LOG_TAG, "Directory not created"); } return file;}
查找空间
如果没有足够空间就会发生 IOException,如果实现要知道 getFreeSpace() or getTotalSpace() 来判断是否有足够的空间来保存文件,返回的是可用空间大小,但是一般需要更多一些
删除文件
myFile.delete(); //删除文件myContext.deleteFile(fileName);//删除internal中的文件
Tips:
卸载时会删除
internal所有
external中的 private file
但是缓存中的文件一般需要手动删除
保存在数据库
因为本人并不是很熟悉 SQL,所以等了解了SQL后再回来看这部分
更多相关文章
- Android(安卓)Studio与Eclipse SDK无法更新解决方案
- Android--打包工具,100个渠道包只需要10秒钟
- Android(安卓)面试之常用开源库
- Android仿微信图片选择器(二)
- Cordova 3.x 源码分析(7) -- CordovaLib概要
- Android的eclipse插件adt无法启动“No target available”
- [Android]用图库打开指定的文件夹,没错是第一个画面直接是图库的
- android工程gen目录中R.java包名是怎么确定
- 设置ubuntu Android(安卓)sdk JDK环境变量