FileProvider 访问 Room 数据库抛出 IllegalArgumentException
FileProvider accessing Room database throws an IllegalArgumentException
我想备份我的应用程序的房间数据库。我正在尝试使用 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
FileProvider
不支持从该位置提供内容。如果您希望直接从该位置提供服务,则需要实施您自己的 ContentProvider
.
另请注意,一个数据库可能包含多个文件,尤其是在启用 WAL 的情况下。 getDatabasePath()
来自 API 级别 1,回到 WAL 不存在并且 SQLite 数据库始终只有一个文件的时候。
FileProvider
只能访问 files/
子目录中的文件,所以我将它们复制到那里。
还是不明白,为什么错误看起来像 Failed to find
,而它应该是 Failed to access
.
另外,Room数据库实际上有3个文件。我得到了他们的路径:
String dbPath = getDatabasePath(DATABASE_NAME).getAbsolutePath();
String[] dbFiles = {dbPath, dbPath + "-wal", dbPath + "-shm"};
我想备份我的应用程序的房间数据库。我正在尝试使用 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
FileProvider
不支持从该位置提供内容。如果您希望直接从该位置提供服务,则需要实施您自己的 ContentProvider
.
另请注意,一个数据库可能包含多个文件,尤其是在启用 WAL 的情况下。 getDatabasePath()
来自 API 级别 1,回到 WAL 不存在并且 SQLite 数据库始终只有一个文件的时候。
FileProvider
只能访问 files/
子目录中的文件,所以我将它们复制到那里。
还是不明白,为什么错误看起来像 Failed to find
,而它应该是 Failed to access
.
另外,Room数据库实际上有3个文件。我得到了他们的路径:
String dbPath = getDatabasePath(DATABASE_NAME).getAbsolutePath();
String[] dbFiles = {dbPath, dbPath + "-wal", dbPath + "-shm"};