从字节数组创建SQLite内存数据库

4
我需要使用一些Java代码处理来自SQLite数据库的数据。问题在于,该数据库是从外部服务检索而来,因此仅可用作InputStream
我真的想避免在开始处理数据之前将数据库保存到文件系统中,但我看不到任何方法可以做到这一点。
我目前正在使用SqlJet,因为它提供了创建内存数据库的选项。然而,似乎没有办法将InputStream/字节数组转换为数据库。
如果提供所需功能,则无需强制使用SqlJet,它可以轻松地被任何其他工具替换。

1
我认为SQLite API不支持打开某种类型的内存块 -> http://sqlite.org/c3ref/open.html - 也许如果你创建一些内存文件系统,但我建议你将流保存到文件并使用它。 - zapl
也许可以使用类似于“jimfs”的虚拟文件系统? - Joel
显然,你可以通过为SQLite编写一个VFS模块来实现这一点。请参阅https://sqlite-users.sqlite.narkive.com/lvdwVRm4/convert-byte-array-to-in-memory-db上的一些文档指针,虽然我不知道需要多少代码。 - andrewdotn
1个回答

1

这样做是不可能的。也许Java支持某种机制来创建一些虚拟文件,将其呈现为某个物理文件(对于当前进程而言)。

我可以想到一种解决限制的方法,但在您的情况下可能无法实现或接受。您可以更改服务以返回数据库的转储,并在接收方的内存数据库中加载:

以下是生成转储的方法:

# sqlite3
SQLite version 3.7.11 2012-03-20 11:35:50
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table foo (i text);
sqlite> insert into foo values ('a');
sqlite> insert into foo values ('b');
sqlite> .dump
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE foo (i text);
INSERT INTO foo VALUES('a');
INSERT INTO foo VALUES('b');
COMMIT;

很棒的想法,回答了问题。谢谢! - Andrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接