上一篇
安卓中的文件数据库
- 行业动态
- 2025-04-23
- 9
安卓文件存储分内部(私有)和外部(公有),数据库常用SQLite,轻量级,本地存储;ContentProvider助跨应用数据共享
安卓文件存储
内部存储(Internal Storage)
- 路径:
/data/data/<包名>/files/
- 特点:
- 默认私有,其他应用不可访问
- 无需申请存储权限(Android 10+ 需注意分区存储限制)
- 适合存储敏感配置、缓存文件等
- API:
File internalFile = new File(context.getFilesDir(), "filename");
外部存储(External Storage)
- 路径:
/storage/emulated/0/
(Android 10+ 需适配沙盒机制) - 特点:
- 公有目录(如
Downloads
)需申请WRITE_EXTERNAL_STORAGE
权限 - 可跨应用共享数据(如媒体文件)
- 可能被用户或系统清理
- 公有目录(如
- API:
File externalFile = new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "image.jpg");
SharedPreferences
- 用途:存储键值对(如配置项)
- 特点:
- 基于XML文件存储,自动序列化
- 支持
MODE_PRIVATE
(私有)或MODE_MULTI_PROCESS
(多进程共享)
- API:
SharedPreferences prefs = context.getSharedPreferences("config", Context.MODE_PRIVATE); prefs.edit().putString("key", "value").apply();
安卓数据库存储
SQLite
- 特点:
- 嵌入式关系型数据库,支持SQL语法
- 单线程默认,需处理多线程并发问题
- 适合结构化数据(如用户信息表)
- API:
SQLiteDatabase db = SQLiteOpenHelper.getReadableDatabase(); db.execSQL("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)");
Room(推荐)
特点:
- SQLite 的抽象层,解决编译时验证问题
- 支持LiveData和RxJava响应式编程
- 自动生成
Dao
实现类
API:
@Entity public class User { @PrimaryKey public int id; public String name; } @Dao public interface UserDao { @Insert fun insert(user: User) @Query("SELECT FROM User") fun getAllUsers(): List<User> }
Realm(第三方库)
- 特点:
- 面向对象的数据库,支持跨平台同步
- 高性能,适合频繁读写的场景(如实时聊天)
- API:
Realm realm = Realm.getDefaultInstance(); realm.executeTransaction(r -> r.insert(new ChatMessage()));
文件与数据库的核心对比
维度 | 文件存储 | 数据库存储 |
---|---|---|
数据结构 | 扁平文件/键值对 | 表结构/对象关系 |
操作方式 | 文件流读写/SharedPreferences API | SQL语句/ORM框架 |
性能 | 小文件高效,大文件较慢 | 复杂查询高效,事务支持 |
适用场景 | 配置文件、临时缓存、媒体文件 | 结构化数据、多表关联、高频读写 |
数据一致性 | 手动管理,易出错 | 事务保障,ACID特性 |
常见问题与解答
问题1:如何选择文件存储还是数据库?
解答:
- 优先文件存储:配置项(SharedPreferences)、临时缓存、媒体文件(如图片/视频)。
- 优先数据库:需要关联查询(如订单+用户信息)、高频读写(如日志记录)、复杂数据结构。
问题2:SQLite和Room的本质区别是什么?
解答:
- SQLite:原生数据库,需手动管理版本升级、线程安全、数据迁移。
- Room:SQLite的封装,提供编译时验证、抽象
Dao
接口、LiveData集成,降低开发复杂度