通过C ++创建SQLite数据库。通过Java SDK访问它?

时间:2012-08-03 09:55:05

标签: android sqlite

以下是我们的情况:

我们有一些本机代码可以在特定时间扫描用户定义的目录。目标是收集有关特定类型文件的数据并从中构建SQLite数据库。可能有数以万计的文件需要查询。

问题是每次找到文件时,收集的有关该文件的数据必须通过JNI边界引入Java-land,然后通过SQLite类提供给数据库。 Android SDK。这需要太久。

建议的解决方案是下载SQLite源代码,将其链接到我们的项目中,并按照此处所述本地构建数据库:SQLite with Android NDK。这将消除将数据从C ++层完全传递到Java层所花费的时间。

问题是:如果这样做,Android SDK(Java层)是否仍可用于打开数据库,正常获取Cursor对象等?我们可以保持数据库非常简单;没有外键,触发器,约束等。虽然索引是非常理想的。

我们已经考虑过管道和套接字来跨越JNI边界移动数据。但是,Fat32文件系统不支持命名管道(因此,如果用户将应用程序移动到Fat32格式的SD卡,则不可用)。套接字也不可用,因为我们必须在清单中包含互联网权限,我们认为这些权限看起来很可疑。

如果有人有任何相关信息,我们很乐意听取您的意见。

非常感谢, P上。

1 个答案:

答案 0 :(得分:3)

为了跟进,我们采取了一种措施,汇总了一个测试应用程序,该应用程序编译了最新的SQLite Amalgamation(3.7.13)源代码。我们发现我们确实能够通过Android Java SDK与本机创建的数据库进行交互。

性能明智,这是一个伟大的飞跃!通过在原生层插入我们的记录,我们发现大量性能提升。以前,将20,000条记录插入非复杂数据库大约需要4分钟。一些简单的分析表明,几乎整个4分钟花费了将数据从本机层传递到Java层。

现在,插入需要4到6秒。我们也可以按照正常情况使用Java API打开,查询数据库等。

需要注意的性能调整是交易并使用以下方式将日记移动到内存:

pragma journal_mode=memory;

出于稳定性原因,我们决定不关闭同步,而且我们对已经取得的成绩感到非常满意。

希望其他人会发现这个建议很有用。

P