如何在USB记忆棒上创建SQLite数据库?

时间:2019-05-22 15:30:29

标签: android sqlite

我想在USB(otg)设备上创建SQL db文件。问题在于,在较新的设备上,我使用SAF访问USB,因此没有实际的文件路径或处理更多的内容。

所有android sqlite openOrCreateDatabase方法都需要使用SAF / DocumentFile不再可能的文件或路径。

我正在考虑使用sqlite替代方案的其他选项,但似乎Realm也不支持此选项?

还有其他想法吗? 因此,我认为sqlite API即将更新以支持DocumentFile或Uri?

为清楚起见,应用程序可以在USB记忆棒上处理大数据,应用程序还需要数据库在USB上存储一些信息。当然我可以在设备上进行创建,然后在usb上进行复制,但是如果该过程在中间停止,会丢失数据吗?

1 个答案:

答案 0 :(得分:0)

由于SQLite does not support opening databases on (SAF) Uris,您不能使用SAF存储SQLite数据库,并且可能永远不会由于链接的答案中所述的原因而存储。

您需要在可访问的位置创建数据库,执行任何读/写操作,然后将数据库复制到USB驱动器上。为避免数据丢失,请不要覆盖目标文件(如果存在),而应使用临时文件并仅在成功完成操作后重命名该文件。


如果您查看全部available storage access methods,则唯一的其他选择是Context#getExternalFilesDirs,这不起作用,因为...

  

返回的路径不包括瞬态设备,例如连接到手持设备的USB闪存驱动器。

但是,对于我在此设备上测试过的设备,似乎并非如此,例如您实际上可以使用getExternalFilesDirs()访问USB设备。例如。如果您有卷uuid 00A1-CC00,则可以以content://com.android.externalstorage.documents/tree/00A1-CC00%3A/document/00A1-CC00%3AAndroid%2Fdata%2Fcom.example%2Ffiles的身份访问SAF Uri /storage/00A1-CC00/Android/data/com.example/files


如果绝对需要在没有临时内部文件的情况下执行数据库操作,则可以在内存数据库中使用h2。这将需要修改的BACKUP TO语句,以允许写入SAF OutputStream。