8月更文挑战|Android基础开发-应用数据文件存储

666 阅读5分钟

这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战

前言

对于App应用来说本地数据缓存管理是一块比较重要的内容。尤其是当应用内具有类似草稿箱、音视频缓存、重要数据保存等功能时需要特别重视。因为一旦数据资源管理不当很可能造成数据丢失、重要数据泄露等问题,很可能会对于版本迭代更新造成不必要的麻烦。Android开发中系统为开发者提供了四种保存应用数据方式:应用专属存储空间、共享存储空间、偏好设置、数据库。

保存应用数据方式

应用专属存储空间

存储只供本应用使用的文件,只专属于本应用。其中内部存储空间保存的文件只能有本应用才有权访问不对外可读可写,具备私密性。

共享存储空间

共享存储空间实际上就是将该应用某些资源数据可供其他应用访问,包括媒体、文档和其他文件。

键值对数据

键值对数据保存其实就是Android开发中的SP(SharedPreferences)。 SharedPreferences以String-Vaule形式存储数据资源,支持String、int、float、long、boolean常用基础类型。通过SharedPreferences.Editor保存数据,从SharedPreferences获取数据。SharedPreferences保存数据需要执行commit或是apply,区别在于commit是同步执行需要主要不要阻塞主线程、apply是异步执行需要注意线程安全。

 SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPref.edit();
    editor.putInt("intVaule", newHighScore);
    editor.commit();
    editor.apply();
    sharedPref.getInt("intVaule",0);

数据库

小文件资源使用SharedPreferences可以很好解决基本问题,但遇到大文件和海量数据时采用SharedPreference会有点力不从心了。因此对于大数据和经常读写的资源内容可以采用数据库形式存储。谷歌官方推出了Room数据库框架,Room基于SQLite在其基础上提供抽象层更方便操作数据库。 Room数据库具体使用可以参考官方文档

除此之外还有Realm跨平台数据库框架,具有更高加密保护、更快、更好用的特点;GreenDAO也是Android第三方开源优秀数据库框架。

存储方式

抛去数据缓存方式,同样应用开发需要知道数据应该怎么保存比较合适。 比如我们的应用数据希望跟随应用自身,比如卸载应用后应用数据可以及时清空不留下残留数据(我走了带走每片云彩),这是一个绿色应用的自我修养;又或者当用户操作系统管理当中清理应用缓存时能够不清除希望应用保存的重要数据。所以应用文件如何存储,存储在哪里就需要开发者去思考和设计了。

在Android旧时代很多手机由于自身内部存储空间有限,还使用外置的SD卡进行数据存储,而时代发展至今现在手机很少在使用外部SD卡去扩充存储空间,手机自身就具备足够的存储空间。可以说现在手机内部就自带”SD卡“了,”SD卡“就是外部存储,手机自身还有内部存储,这也算是存储分区。

内部存储

每个应用安装到安卓系统后在内部存储都有自己独有文件目录,例如app包名”com.julyyu.develop“,该应用内部存储的目录命名就是:/data/user/0/com.julyyu.develop/。因为安卓原生系统支持多用户使用所以就有/user/0/的设计,类似于window系统中创建新家庭用户一样,每个用户存储数据是独立的,不过安卓手机系统也不太出现使用到多用户的场景了(家里谁还用会同时用同一台手机呢)。

上述提到持久化存储内容像SharedPreferences、数据库文件资源就是存储在内部存储中确保应用数据安全。通常这部分数据无法通过手机文件管理器直接访问查看,除非通过特殊手段(root、高权限、应用开发者)才有权查看到。

另外除了以上两种持久化存储外,开发者也可以通过以下方式将文件存储在内部存储中。

image.png image.png

目录说明
cache缓存文件目录 getCacheDir()
files文件目录 getFilesDir()
databases数据库文件
shared_prefssp存储

外部存储

外部存储不同于内部存储,因为内部存储是应用内部本身可以自由读写操作,访问外部存储则需要声明文件读写权限才可访问。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

外部存储主要以sdcard和storage为主,其实两者都是映射到同一个目录下。应该是安卓时代历史原因而保留了外部存储卡sdcard目录。

sdcardstorage
image.pngimage.png

应用可以在外部存储创建自身的外部存储目录,可以通过调用以下方法创建相应目录文件例如cache目录等

方法名说明
getExternalCacheDir()/storage/emulated/user/0/Android/data/com.julyyu.develop/cache/
getExternalFilesDir(Environment.DIRECTORY_PICTURES)/storage/emulated/user/0/Android/data/com.julyyu.develop/Picutres/
getExternalFilesDir(Environment.DIRECTORY_DCIM)/storage/emulated/user/0/Android/data/com.julyyu.develop/DCIM/
getExternalFilesDir(null)/storage/emulated/user/0/Android/data/com.julyyu.develop/files/

除此之外也可以通过Environment.getExternalStorageDirectory()方法获取到外部存储根目录,不过在高版本中已经是废弃方法不再适用。

数据清理

上述说到对于用户若主动清理缓存,会清理掉应用的内部和外部cache目录文件。若是清除全部数据则是应用内部和外部对于应用目录下所有文件。 image.png

参考&深入阅读