SharedPreferences
SharedPreferences 是一种轻量级的键值对存储方式,主要用于保存应用的用户偏好设置、配置信息等少量数据。

- 存储位置:
/data/data/<包名>/shared_prefs/,以 XML 文件形式存在。 - 使用方式:通过
Context.getSharedPreferences()或PreferenceManager.getDefaultSharedPreferences()获取实例,支持edit()提交修改。 - 支持的数据类型:字符串、整数、布尔值、浮点数、长整型、字符串集合(Set
- 特点:
- 读写简单,无需显式创建文件或数据库。
- 默认单进程访问,多进程模式已标记为不安全(不推荐使用)。
- 适合存储键值对形式的简单数据,如是否首次启动、用户登录状态等。
- 注意事项:避免存储大量数据,否则会导致读取/写入缓慢,影响性能。
内部存储
内部存储是应用私有的文件存储空间,其他应用无法直接访问,适合保存敏感或私有文件。
- 存储位置:
/data/data/<包名>/files/(可通过getFilesDir()获取)。 - 使用方式:
- 写入:
openFileOutput(name, mode)返回FileOutputStream。 - 读取:
openFileInput(name)返回FileInputStream。 - 缓存文件:
getCacheDir()获取临时缓存目录,系统可能自动清理。
- 写入:
- 特点:
- 不需要任何权限。
- 文件仅对当前应用可见,卸载应用时自动删除。
- 存储空间有限,适合存放核心配置文件或小型数据。
- 注意事项:
mode参数已弃用(如MODE_WORLD_READABLE),建议使用Context.MODE_PRIVATE保证安全性。
外部存储
外部存储指设备的外部存储空间(如 SD 卡或内置分区),分为公有目录和私有目录,适合存储较大文件或共享数据。
- 公有目录:通过
Environment.getExternalStoragePublicDirectory(type)获取,如DIRECTORY_DCIM、DIRECTORY_DOWNLOADS,文件可被其他应用和用户直接访问,卸载应用后仍然保留。 - 私有目录:通过
Context.getExternalFilesDir(type)或Context.getExternalCacheDir()获取,应用卸载时自动删除,不需要额外权限(Android 10+ 推荐使用)。 - 权限要求:
- Android 10 以下:读写公有目录需声明
READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE权限,并动态申请。 - Android 10 及以上:访问公有目录推荐使用
MediaStore或SAF(存储访问框架),私有目录无需权限。
- Android 10 以下:读写公有目录需声明
- 特点:
- 存储空间较大,适合存放图片、视频、文件等。
- 外部存储可能被移除或不可用,使用前需检查
Environment.getExternalStorageState()。
- 注意事项:公有目录的文件可被其他应用修改,注意隐私敏感数据不要存放于此。
SQLite 数据库
SQLite 是 Android 内置的关系型数据库引擎,适用于结构化数据存取,如用户信息、商品列表等。

- 存储位置:
/data/data/<包名>/databases/,以.db文件形式存在。 - 使用方式:
- 传统方式:继承
SQLiteOpenHelper实现onCreate、onUpgrade方法,操作SQLiteDatabase对象。 - 现代方式:使用 Room 持久化库(Android Jetpack 组件),提供编译时 SQL 检查、自动生成代码等特性。
- 传统方式:继承
- 特点:
- 支持 SQL 语句,具备完善的查询、插入、更新、删除功能。
- 数据存储在单一文件中,结构清晰,支持事务、索引。
- 适合复杂关联数据,性能优于多次读写文件。
- 注意事项:数据库操作应避免在主线程执行(可使用
AsyncTask、LiveData或协程),防止阻塞 UI。
相关问题与解答
如何将复杂对象(如一个 Java 对象)存入 SharedPreferences?
解答:SharedPreferences 只支持基本数据类型和字符串集合,不能直接存储对象,可以将对象序列化为 JSON 字符串后再存储,例如使用 Gson 库:
// 存入
SharedPreferences prefs = getSharedPreferences("data", MODE_PRIVATE);
String json = new Gson().toJson(myObject);
prefs.edit().putString("myObject", json).apply();
// 取出
String json = prefs.getString("myObject", "");
MyObject myObject = new Gson().fromJson(json, MyObject.class);
此方法适用于数据量较小的场景,如需存储大量对象或复杂关系,建议改用 SQLite 或 Room。
内部存储和外部存储(私有目录)在数据安全性上有什么区别?应用卸载时分别如何处理?
解答:

- 内部存储:文件存储在应用私有目录,其他应用默认无法访问,安全性较高,应用卸载时,系统会自动删除该应用的所有内部存储文件,包括
files/和cache/目录下的内容。 - 外部存储(私有目录):通过
getExternalFilesDir()获取的目录同样是应用私有,其他应用无法直接访问(Android 10+ 已限制访问,低版本需权限),但文件位于外部存储,可能因用户卸载应用或清理缓存被删除,系统也会在卸载时自动删除该目录,外部存储私有目录适合存放较大文件,但安全性较内部存储稍低,因为外部存储本身可能被移除或挂载。 - 敏感数据优先使用内部存储;较大、非敏感文件可使用外部存储私有目录。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/511176.html