当前位置:首页 > 行业动态 > 正文

安卓创建数据库权限设置

安卓创建数据库时,若存放在应用私有目录(如/data/data)无需申请权限;若需写入外部存储,需在Manifest声明 WRITE_EXTERNAL_STORAGE,Android 10+需用分区存储或Scoped Storage

安卓创建数据库权限设置详解

数据库创建基础

在安卓中创建数据库通常使用 SQLiteOpenHelper 或第三方库(如 Room),无论采用哪种方式,均需注意存储路径和权限配置。

常见存储路径:

  • 内部存储/data/data/<包名>/databases/(无需申请权限)
  • 外部存储/storage/emulated/0/(需动态申请权限)

权限配置

  1. AndroidManifest.xml 声明权限

    安卓创建数据库权限设置  第1张

    • 若需访问外部存储,需声明以下权限:
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
      <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    • 注意:Android 10(API 29)后,外部存储权限被限制,需改用分区存储或 MediaStore API。
  2. 动态申请运行时权限

    • 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);
      }

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+ 适配

  1. 分区存储限制

    • 外部存储需使用 MediaStoreScoped Storage,直接访问路径被限制。
    • 推荐将数据库存储在应用专属目录(getFilesDir())或 Cache 目录。
  2. 替代方案

    • 使用 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 共享数据库?

解答

  1. 实现 ContentProvider:继承 ContentProvider 并重写 query(), insert() 等方法。
  2. 配置权限:在 AndroidManifest.xml 中声明 provider 并设置 android:permission
  3. 调用方授权:其他应用需声明相同权限,并通过 ContentResolver 操作
0