安卓应用的数据库(基于SQLite)默认存储在应用的内部私有目录中,路径格式如下:
设备类型 | 完整路径 |
---|---|
所有安卓设备 | /data/data/<应用包名>/databases/<数据库名称> |
示例 | /data/data/com.example.myapp/databases/mydatabase.db |
通过 Context
获取
File dbFile = context.getDatabasePath("database_name").getFile(); String path = dbFile.getAbsolutePath();
直接访问系统目录
File databaseDir = context.getDir("databases", Context.MODE_PRIVATE); File dbFile = new File(databaseDir, "database_name.db");
场景 | 说明 |
---|---|
使用 Room 框架 | 默认路径与 SQLite 一致,可通过 Context.getDatabasePath 获取。 |
多进程模式(如 ContentProvider) | 仍存储在应用私有目录,但需注意多进程访问权限。 |
模拟器 vs 真机 | 路径结构一致,但模拟器中可通过 Android Studio 直接查看(需 root 权限)。 |
权限限制
WRITE_EXTERNAL_STORAGE
权限。数据库文件生成时机
SQLiteOpenHelper.getReadableDatabase()
或 getWritableDatabase()
时创建。调试与查看
Device File Explorer
访问(需模拟器或 root 真机)。adb shell "run-as <包名> cat /data/data/<包名>/databases/<数据库名>.db" > local_db.sql
问题 | 解决方案 |
---|---|
数据库文件不可见(真机) | 需 root 设备后通过文件管理器访问,或使用 ADB 命令导出。 |
多数据库文件管理 | 通过 getDatabasePath("db2") 指定不同数据库名,或动态创建目录。 |
数据库跨应用共享(风险) | 将数据库存储在外部公共目录(如 /sdcard/ ),但需处理权限和安全性问题。 |
解答:
SQLiteDatabase.copyDatabase
复制文件到外部目录。 File internalDb = context.getDatabasePath("mydb").getFile(); File externalDb = new File(context.getExternalFilesDir(null), "mydb.db"); if (!externalDb.exists()) { SQLiteDatabase.copyDatabase(internalDb, externalDb); }
解答:
SQLiteDatabase.openDatabase
并设置 ENCRYPTED
标志。 SQLiteDatabase db = SQLiteDatabase.openDatabase(file, null, Context.MODE_PRIVATE, new SQLiteDatabase.CursorFactory() {}); // 启用加密(需 API 26+) db.execSQL("PRAGMA cipher_migrate;"); // 迁移明文到加密