上一篇
安卓创建数据库权限设置
- 行业动态
- 2025-04-24
- 4588
安卓创建数据库时,若存放在应用私有目录(如/data/data)无需申请权限;若需写入外部存储,需在Manifest声明
WRITE_EXTERNAL_STORAGE
,Android 10+需用分区存储或Scoped Storage
安卓创建数据库权限设置详解
数据库创建基础
在安卓中创建数据库通常使用 SQLiteOpenHelper
或第三方库(如 Room),无论采用哪种方式,均需注意存储路径和权限配置。
常见存储路径:
- 内部存储:
/data/data/<包名>/databases/
(无需申请权限) - 外部存储:
/storage/emulated/0/
(需动态申请权限)
权限配置
AndroidManifest.xml 声明权限
- 若需访问外部存储,需声明以下权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
- 注意:Android 10(API 29)后,外部存储权限被限制,需改用分区存储或
MediaStore
API。
- 若需访问外部存储,需声明以下权限:
动态申请运行时权限
- Android 6.0(API 23)及以上需动态申请敏感权限:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE); }
- Android 6.0(API 23)及以上需动态申请敏感权限:
ContentProvider 权限管理
若需跨应用共享数据库,需通过 ContentProvider
实现,并在 AndroidManifest.xml
中配置权限:
<provider android:name=".MyContentProvider" android:exported="true" android:permission="com.example.MY_PROVIDER_PERMISSION" />
- 自定义权限:在
res/values/strings.xml
中定义:<string name="app_name">MyApp</string> <string name="MY_PROVIDER_PERMISSION">com.example.MY_PROVIDER_PERMISSION</string>
- 授权其他应用:调用方需声明相同权限:
<uses-permission android:name="com.example.MY_PROVIDER_PERMISSION" />
Android 10+ 适配
分区存储限制:
- 外部存储需使用
MediaStore
或Scoped Storage
,直接访问路径被限制。 - 推荐将数据库存储在应用专属目录(
getFilesDir()
)或Cache
目录。
- 外部存储需使用
替代方案:
- 使用
RoomDatabase
自动管理存储路径。 - 通过
ContentResolver
操作MediaStore
实现文件读写。
- 使用
单元表格:存储位置与权限对照
存储位置 | 权限要求 | 适用场景 |
---|---|---|
内部存储(getFilesDir ) | 无 | 本应用专用数据,无需权限 |
外部存储(公开目录) | WRITE_EXTERNAL_STORAGE (Android 10前) | 共享文件,需动态申请权限 |
ContentProvider | 自定义权限 + android:exported | 跨应用数据共享 |
MediaStore | 无(需动态申请媒体相关权限) | Android 10+ 推荐替代外部存储 |
相关问题与解答
问题1:Android 11(API 30)如何存储数据库文件?
解答:
- 推荐方案:使用应用内部存储(
getFilesDir()
),无需申请权限。 - 外部存储:若必须使用,需通过
MediaStore
API 或Storage Access Framework
,并声明MANAGE_EXTERNAL_STORAGE
权限(需用户手动授权)。
问题2:如何通过 ContentProvider 共享数据库?
解答:
- 实现 ContentProvider:继承
ContentProvider
并重写query()
,insert()
等方法。 - 配置权限:在
AndroidManifest.xml
中声明provider
并设置android:permission
。 - 调用方授权:其他应用需声明相同权限,并通过
ContentResolver
操作