我想在USB(otg)设备上创建SQL db文件。问题在于,在较新的设备上,我使用SAF访问USB,因此没有实际的文件路径或处理更多的内容。
所有android sqlite openOrCreateDatabase方法都需要使用SAF / DocumentFile不再可能的文件或路径。
我正在考虑使用sqlite替代方案的其他选项,但似乎Realm也不支持此选项?
还有其他想法吗? 因此,我认为sqlite API即将更新以支持DocumentFile或Uri?
为清楚起见,应用程序可以在USB记忆棒上处理大数据,应用程序还需要数据库在USB上存储一些信息。当然我可以在设备上进行创建,然后在usb上进行复制,但是如果该过程在中间停止,会丢失数据吗?
答案 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。