繁体   English   中英

使用 Android 10+ 直接访问文件(SQlite 数据库)

[英]Direct file access (SQlite database) with Android 10+

我有 2 个应用程序 A 和 B。A 可以将数据下载到 B 拥有的 sqlite 数据库。直到现在我问用户 WRITE_EXTERNAL_STORAGE 权限,A 可以直接写入 B 的数据库,因此使用事务以避免更改数据库,如果用户取消该过程。

使用 Android 10 直接文件访问似乎不再可能,因为我们被迫使用 ****** SAF ...

为了仍然可以正常工作,我更新了我的应用程序以使用 ContentProvider。 但是,我不再能够使用事务来提供取消功能:数据太重而无法放入内存中,我无法使用 ContentProvider 的批量插入方法(如果我没记错的话?)。

我被卡住了吗? 或者是否有解决方案可以在我拥有的两个应用程序之间授予直接文件访问权限? 理想情况下,他的流程是这样的:

  • 1 向 B 请求一个文件访问权限
  • B 授予访问权限
  • A 开始交易
  • 一个下载文件 1
  • 一个下载文件 2
  • [...]
  • 一个下载文件 n
  • A 提交事务(如果用户要求取消则回滚)
  • A通知B下载完成
  • B 撤销访问

那可能吗?

编辑:我需要访问 File 对象,以便使用 SqliteDatabaseOpenHelper 类,因此 grantUriPermission 不会帮助我。

有没有一种解决方案可以在我拥有的两个应用程序之间授予直接文件访问权限?

不。

我被卡住了吗?

你可以这样做:

  • 一个下载文件 1
  • 一个下载文件 2
  • [...]
  • 一个下载文件 n
  • A通过某种方式告诉B“哟,我下载了这些文件”(见下文),如果用户没有取消操作
  • B 更新自己的数据库

“通过某种方式”可能是:

  • insert()update()与您的ContentProvider
  • startService()传递的命令
  • bindService()和对 B 的服务公开的 AIDL 定义的 API 的调用
  • 广播Intent有明确的Intent
  • 在 B 中开始一项活动,如果合适的话(可能不是,只是为了完整性而提及)

A 有一个“用户交易”,可以根据用户交互停止下载。 下载完成后,B 可以执行数据库事务以使用下载内容的详细信息更新自己的数据库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM