Xamarin中使用Android存储访问框架:保存已有DB3文件及文件访问问题
Xamarin Android 利用Storage Access Framework处理SQLite文件
一、保存已有SQLite文件到SD卡
你当前的代码仅创建空文件,要将已有db3文件写入用户选择的位置,需在用户通过ACTION_CREATE_DOCUMENT选定保存路径后,把本地数据库内容复制到目标文件中:
- 重写
OnActivityResult方法,获取用户选择的文件URI - 通过
ContentResolver打开该URI对应的输出流 - 将本地已有db3文件的内容写入到输出流中
示例代码:
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data) { base.OnActivityResult(requestCode, resultCode, data); if (requestCode == 40 && resultCode == Result.Ok && data != null) { // 获取用户选择的保存URI Uri saveUri = data.Data; // 本地已有db3文件的路径(替换成你实际的数据库路径) string localDbPath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData), "your_local_db.db3"); try { // 打开本地数据库文件的输入流 using (FileStream inputStream = new FileStream(localDbPath, FileMode.Open, FileAccess.Read)) { // 通过ContentResolver打开目标文件的输出流 using (Stream outputStream = ContentResolver.OpenOutputStream(saveUri)) { // 复制文件内容 inputStream.CopyTo(outputStream); } } // 保存成功提示 Toast.MakeText(this, "数据库保存成功", ToastLength.Short).Show(); } catch (Exception ex) { Toast.MakeText(this, $"保存失败: {ex.Message}", ToastLength.Long).Show(); } } }
注意:替换localDbPath为你应用中实际的SQLite数据库文件路径。
二、打开SD卡中的SQLite文件并访问
用户通过ACTION_OPEN_DOCUMENT选择文件后,SQLite无法直接通过Content URI访问文件,需先将文件复制到应用私有目录或缓存目录,再进行数据库操作:
- 在
OnActivityResult中获取选中文件的URI - 通过
ContentResolver打开输入流,将文件复制到应用私有目录 - 使用复制后的本地路径初始化SQLite连接
示例代码:
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data) { base.OnActivityResult(requestCode, resultCode, data); if (requestCode == 50 && resultCode == Result.Ok && data != null) { Uri fileUri = data.Data; // 复制到应用私有目录的临时路径 string tempDbPath = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData), "temp_imported.db3"); try { // 打开选中文件的输入流 using (Stream inputStream = ContentResolver.OpenInputStream(fileUri)) { // 打开本地临时文件的输出流 using (FileStream outputStream = new FileStream(tempDbPath, FileMode.Create, FileAccess.Write)) { inputStream.CopyTo(outputStream); } } // 现在可以用这个临时路径打开SQLite数据库 var sqliteConnection = new SQLiteConnection(tempDbPath); // 执行数据库操作,比如查询 var dataList = sqliteConnection.Query<YourModel>("SELECT * FROM YourTable"); // 操作完成后可根据需求删除临时文件 // File.Delete(tempDbPath); Toast.MakeText(this, "数据库加载成功", ToastLength.Short).Show(); } catch (Exception ex) { Toast.MakeText(this, $"加载失败: {ex.Message}", ToastLength.Long).Show(); } } }
说明:
YourModel需要替换成你实际的数据模型类- 临时文件可以在使用完成后删除,也可以保留供后续使用
- 若需长期访问该文件,可通过
ContentResolver.TakePersistableUriPermission获取持久权限,避免下次打开需重新选择
内容的提问来源于stack exchange,提问作者randycobb12
相关产品推荐
相关产品推荐

