type
status
date
slug
summary
tags
category
icon
password
存储数据的几种方式
- 应用专属存储空间
- 内部存储
- dataDir: /data/data/packagename
- filesDir: /data/data/packagename/files
- cacheDir: /data/data/packagename/cache
- codeCacheDir:/data/data/packagename/code_cache
- 外部存储
- externalCacheDir:/storage/emulated/0/Android/data/pacakagename/cache
- getExternalFilesDir:/storage/emulated/0/Android/data/pacakagename/files
- externalMediaDirs
- SharedPreference
- 本地数据库
应用专属空间里的数据会在应用被卸载的时候删除,清除缓存通常指的是清除缓存文件下的文件,清空数据则是清空所有cache,files下文件,如果想让其他APP可以访问这些私有数据,可以利用FileProvider。
大多是通过Context获取的地址,一般在/data/data文件夹下,如
可以通过Context获取,也可以通过Environment获取,一般在/storage/emulated/0/Android/data/pacakagename/,如:
- 共享的存储空间
- media files
- 文档和其他文件
可以被其他APP访问的数据,app卸载不会被删除,通常位于/storage/emulated/0下(除了/storage/emulated/0/Android/data/pacakagename)。
可以通过 MediaStore处理
可以通过ContentResolver和其他相关方法处理
几个容易混淆的地方
/data/data vs /data/user/0
/Android/data vs /Android/user/0
现在的手机操作系统多是支持多用户的,最常见的就是“访客模式”,通常情况下,/data/data 与 /data/user/0是等价的,对于不同的用户,实际的存储位置可能是/user/xxx,但是我们通常只需要访问/data/data即可。
/mnt/sdcard vs /sdcard vs /storage/sdcard0
这个其实就是“软链接”的区别,可以通过
ls -l
命令查看:storage/sdcard0 -> /sdcard mnt/sdcard -> /storage/self/primary sdcard -> /storage/self/primary
可以看到这几个地址的真实地址实际上都是/storage/self/primary。
/storage/emulated/0
共享的存储空间的根目录,其中0代表的是主存,如果有移动的存储空间,如外接SD卡,则会有其他数字。
可通过下列方法获取:
Environment.getExternalStorageDirectory()
在Android Q之后,这个方法标记废弃,可以使用
Context#getExternalFilesDir(String)
或者
MediaStore
,Intent#ACTION_OPEN_DOCUMENT
等方法作为替代。该目录下在没有被app污染时,通常有以下这些子目录:
Alarms Android DCIM Download Movies Music Notifications Pictures Podcasts Ringtones
对于具体的子目录,可以通过以下方法获取:
Environment.getExternalStoragePublicDirectory
Android Q之后,可用上面说的
Context#getExternalFilesDir(String)
,MediaStore
,Intent#ACTION_OPEN_DOCUMENT
替代。- 作者:姜康
- 链接:https://jiangkang.tech/article/7dc01d0b-7305-4a87-88de-dca0e1dc27e1
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章