以下是我们的情况:通过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.
您是如何处理数据库锁的?如果Im从Android中的几个线程访问数据库,并且在本地访问数据库,是否会有数据库损坏的可能性?你有没有遇到过这样的问题?我知道SQL是线程安全的,但我不确定是否真的可以跨Java和C++线程安全。我知道这是非常旧的帖子,但是如果你能在这里提供一些想法,我会非常感谢 – Santosh 2014-11-26 14:44:38
对不起,但是对于我们来说,线程化并不是问题,因为我们将所有记录插入本地层之前的任何其他部分(Java层)开始读取/写入/删除/修改这些记录。 – protectedmember 2015-08-19 08:00:06
@protectedmember你是如何管理的? - 一些简单的分析显示,几乎整个4分钟都是将数据从本地层传递到Java层。 – 2017-09-28 13:49:37