FileProvider访问Room数据库时抛出IllegalArgumentException

时间:2019-08-29 10:52:45

标签: android android-room android-fileprovider

我想备份我的应用程序的Room数据库。我正在尝试使用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_paths.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(DATABASE_NAME).getAbsolutePath()的结果如下:

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

2 个答案:

答案 0 :(得分:0)

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

此外,请注意,数据库可能是多个文件,尤其是在启用WAL的情况下。 getDatabasePath()来自API级别1,当时WAL不存在,而SQLite数据库始终只是一个文件。

答案 1 :(得分:0)

.lazy { display: none !important; } 只能访问FileProvider子目录中的文件,因此我将文件复制到了那里。

仍然无法理解,为什么错误应该像files/一样显示为Failed to find

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

Failed to access