当前位置: 首页 > 知识库问答 >
问题:

访问文件室数据库的文件提供程序引发IllegalArgumentException

向实
2023-03-14

我想备份我的应用程序的房间数据库。我试图使用FileProvider获取数据库的uri,但它在这一行抛出了IAE:

 Uri contentUri = FileProvider.getUriForFile(this,
                "com.trulden.friends.FileProvider", getDatabasePath(DATABASE_NAME));

AndroidManifest中。xml我有这个提供者标签:

<application .. >
        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="${applicationId}.FileProvider"
            android:exported="false"
            android:grantUriPermissions="true"
            >
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"
                />
        </provider>
...
</application>

provider\u路径。xml如下所示:

<paths>
    <files-path name="database" path="databases/"/>
</paths>

错误:

08-29 13:28:27.430 8146-8146/com.trulden.friends E/MessageQueue-JNI: java.lang.IllegalArgumentException: 
Failed to find configured root that contains 
/data/data/com.trulden.friends/databases/friends_database
        at androidx.core.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:739)

getDatabasePath(数据库名称)的结果。getAbsolutePath()如下所示:

/data/data/com.trulden.friends/databases/friends_database

共有2个答案

王轶
2023-03-14

FileProvider只能访问files/子目录中的文件,所以我将它们复制到了那里。

仍然无法理解为什么错误看起来像是未能找到,而实际上应该是未能访问

另外,Room数据库实际上有三个文件。我得到了他们这样的路径:

String dbPath = getDatabasePath(DATABASE_NAME).getAbsolutePath();
String[] dbFiles = {dbPath, dbPath + "-wal", dbPath + "-shm"};
贝自怡
2023-03-14

FileProvider不支持从该位置提供内容。如果您希望直接从该位置提供服务,则需要实现自己的ContentProvider

另外,请注意,一个数据库可能是多个文件,特别是如果启用了WAL。getDatabase asePath()来自API Level 1,早在WAL不存在并且SQLite数据库总是只有一个文件的时候。

 类似资料:
  • 我正在使用QAF,这是一个很棒的工具,但我有一个问题。有没有什么方法可以像在BDD文件中那样使用自定义数据提供程序参数化cucumber功能步骤? 例如,我们可以从外部文件插入数据 在里面BDD是这样做的:

  • 我想使用房间数据库,但在构建应用程序时出现以下错误: 执行组织时出错。喷气式飞机。科特林。格拉德尔。内部的KaptExecution公司 和一些这样的错误: 错误:不确定如何将游标转换为此方法的返回类型(java.util.ArrayList 我将数据库与这些类一起使用: 书签实体: 书签数据库: 书签DAO: 我为房间添加此依赖项: 并在构建顶部添加应用插件:“kotlin kapt”。grad

  • 好的,我找了又找,没有找到一个有类似问题的人。我正在开发一个使用Android Studio的Android应用程序,并已开始创建我的SQLite数据库。为了测试我的创建和升级功能,我想提取我的SQLite数据库并查看其内容。 在线说明相当清楚,打开Android设备监视器,选择设备,进入文件资源管理器,然后浏览数据文件夹中的几个层次以找到您的。数据库文件。麻烦就从这里开始。我根本无法展开根级别的

  • manifest.xml提供商 资源文件 使用fileprovider 参考:此处 描述:我无法使用此文件提供程序打开图像、文本文件、pdf。当我打开文件文本文件时,它的give me ERR\u UNKNOWN\u URL\u方案。如果我打开图片或pdf,它什么都不显示

  • 问题内容: 我正在使用SQLMemebershipProvider并使用配置文件。我有一个名为UserProfile的自定义类,该类继承自ProfileBase类,并使用它来设置自定义属性,例如“FullName”。我想遍历数据库中的所有用户并获得对其配置文件属性的访问。在每次迭代中,我都调用ProfileBase.Create()以获得新的配置文件,然后访问属性。 在我看来,每次调用Profil

  • 我有两个app:app1和app2。 App2具有: paths.xml: App2在其活动中从App1接收获取映像URI的请求。确定URI后,App2活动执行以下操作: 从App2接收回结果后,App1执行以下操作: 在App1中,从App2返回时,我得到以下异常: java.lang.SecurityException:权限拒绝:从ProcessRecord{52a99eb0 3493:com