我正在使用SQLite数据库编写应用程序。我已经编写了备份我的SQLite数据库的代码,现在我想能够从这样的副本中恢复我的应用程序数据库。我使用安卓设备的“打开”对话框,如果我在列表中使用其他内容提供者,例如“蓝牙文件传输”,我可以看到该文件!但是,如果我尝试使用“下载”选项,则看不到它。
我将SQLite数据库复制到了下载文件夹中。我尝试使用fileIntent.setType("/")。
谢谢。
我正在使用SQLite数据库编写应用程序。我已经编写了备份我的SQLite数据库的代码,现在我想能够从这样的副本中恢复我的应用程序数据库。我使用安卓设备的“打开”对话框,如果我在列表中使用其他内容提供者,例如“蓝牙文件传输”,我可以看到该文件!但是,如果我尝试使用“下载”选项,则看不到它。
我将SQLite数据库复制到了下载文件夹中。我尝试使用fileIntent.setType("/")。
谢谢。
它是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的答案。
自2018年2月起,SQLite3格式已在IANA注册了官方媒体类型:application/vnd.sqlite3
。使用application/x-sqlite3
已被弃用,仅在需要向后兼容时才使用。
详见:
我没有完整的答案,但可以提供几个想法。
我不确定你所说的“打开”对话框是什么意思。我猜你指的是“选择器”对话框,它会显示能够处理意图的应用程序的图标。
许多Android应用程序使用MimeTypeMap来关联文件扩展名和MIME类型。没有方法可以迭代MimeTypeMap以查看其所有映射。我相当有信心这些是映射。列表中没有SQLite的条目。SQLite的传统MIME类型应为“application/x-sqlite3”。
在您的帖子中,您包括fileIntent.setType("/")
。我猜你实际上输入了fileIntent.setType("*/*")
,因为它没有引号,格式化程序吞噬了两个星号。
由于您可以为SQLite数据库文件指定任何扩展名,因此可以灵活选择一个产生所需结果的扩展名。我猜你想找到一个既包含Download又排除不需要的应用程序的扩展名。在查看MimeTypeMap
支持的映射列表后,您可能需要进行实验。