安卓:如果我想从“下载”文件夹查看/选择SQLite数据库,应该使用哪种mime类型?

20

我正在使用SQLite数据库编写应用程序。我已经编写了备份我的SQLite数据库的代码,现在我想能够从这样的副本中恢复我的应用程序数据库。我使用安卓设备的“打开”对话框,如果我在列表中使用其他内容提供者,例如“蓝牙文件传输”,我可以看到该文件!但是,如果我尝试使用“下载”选项,则看不到它。

我将SQLite数据库复制到了下载文件夹中。我尝试使用fileIntent.setType("/")。

谢谢。

3个回答

23

它是application/x-sqlite3。我在自己的应用程序中使用它。

更多信息请参考这里

下面是我使用它的示例

File backupDB = ...;

//Uri uri = Uri.fromFile(backupDB); //From Android 7, this line results in a FileUriExposedException. Therefore, we must use MyFileProvider instead...
Uri uri = FileProvider.getUriForFile(this, getApplicationContext().getPackageName() + ".com.example.myapp.myfileprovider", backupDB);

Intent newIntent = new Intent(Intent.ACTION_VIEW);
newIntent.setDataAndType(uri, "application/x-sqlite3");
newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
newIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

startActivity(newIntent);

为了完整起见,这是我的MyFileProvider.java类:

package com.example.myapp;

import android.support.v4.content.FileProvider;

public class MyFileProvider extends FileProvider {
}

这里是如何在 清单文件 中声明它的方法:

<provider
    android:name=".MyFileProvider"
    android:authorities="${applicationId}.com.example.myapp.myfileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/my_file_provider_paths"/>
</provider>

最后,这是我的my_file_provider_paths.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path name="external_files" path="."/>
</paths>

### 更新(2019年11月20日)###

显然,application/x-sqlite3现在已被弃用。有关更多信息,请参见下面的Fabian的答案


请注意,此答案与内容类型相关。MIME类型是不同的。MIME: application/vnd.sqlite3 类型:application/x-sqlite3 - Matthew Ferguson

20

这可能有所帮助:http://fileformats.archiveteam.org/wiki/DB_(SQLite) - Matthew Ferguson

2

我没有完整的答案,但可以提供几个想法。

我不确定你所说的“打开”对话框是什么意思。我猜你指的是“选择器”对话框,它会显示能够处理意图的应用程序的图标。

许多Android应用程序使用MimeTypeMap来关联文件扩展名和MIME类型。没有方法可以迭代MimeTypeMap以查看其所有映射。我相当有信心这些是映射。列表中没有SQLite的条目。SQLite的传统MIME类型应为“application/x-sqlite3”。

在您的帖子中,您包括fileIntent.setType("/")。我猜你实际上输入了fileIntent.setType("*/*"),因为它没有引号,格式化程序吞噬了两个星号。

由于您可以为SQLite数据库文件指定任何扩展名,因此可以灵活选择一个产生所需结果的扩展名。我猜你想找到一个既包含Download又排除不需要的应用程序的扩展名。在查看MimeTypeMap支持的映射列表后,您可能需要进行实验。


感谢qbix抽出时间来查看我的问题。是的,我指的是星号斜杠星号用于MIME类型。这是正确的使用方式,我编写了一些调试代码来检查SQLite文件的MIME类型,它实际上就是星号斜杠星号。 - Serge Plourde
“打开”对话框是让您从“最近”,“下载”,外部SD卡,内部存储或使用应用程序列表中选择的对话框。我只能通过使用一些列出的应用程序来选择文件。例如,我可以使用ES文件浏览器或Dropbox。 - Serge Plourde

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接