2012-08-03 93 views
2

以下是我们的情况:通过C++创建SQLite数据库。通过Java SDK访问它?

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

问题是,每个文件被发现的时间,收集了有关该文件的数据必须跨越JNI边界Java的土地通过由Android SDK中提供的SQLite的类被comitted到数据库之前迎来。这需要太远太长。

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

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

我们已经考虑了将数据移动到JNI边界的管道和套接字。但是,Fat32文件系统不支持命名管道(因此,在用户将应用程序移动到Fat32格式的SD卡时,这是不可用的)。套接字也不可用,因为我们必须在清单中包含Internet许可,而我们认为这些许可看起来可疑。

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

非常感谢, P.

回答

2

只需跟进,我们采取了暴跌,扔在一起编译最新的SQLite的融合(3.7.13)的源代码测试应用程序。我们发现我们确实能够通过Android Java SDK与本地创建的数据库进行交互。

表现明智,这是一个很大的飞跃!通过在本地层插入我们的记录,我们发现了性能增加的大规模。以前,将20,000条记录插入非复杂数据库需要大约4分钟的时间。一些简单的分析显示,几乎整个4分钟都是将数据从本地层传递到Java层。

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

性能调整需要注意的是交易和使用日志移动到内存:

pragma journal_mode=memory; 

我们决定不关闭出于稳定性的原因同步,再加上我们都乐意与我们已经达到了性能更。

希望其他人会觉得这个建议很有用。

P

+0

您是如何处理数据库锁的?如果Im从Android中的几个线程访问数据库,并且在本地访问数据库,是否会有数据库损坏的可能性?你有没有遇到过这样的问题?我知道SQL是线程安全的,但我不确定是否真的可以跨Java和C++线程安全。我知道这是非常旧的帖子,但是如果你能在这里提供一些想法,我会非常感谢 – Santosh 2014-11-26 14:44:38

+0

对不起,但是对于我们来说,线程化并不是问题,因为我们将所有记录插入本地层之前的任何其他部分(Java层)开始读取/写入/删除/修改这些记录。 – protectedmember 2015-08-19 08:00:06

+0

@protectedmember你是如何管理的? - 一些简单的分析显示,几乎整个4分钟都是将数据从本地层传递到Java层。 – 2017-09-28 13:49:37