2013-06-25 24 views
3

人们似乎对Android的游标窗口大小1MB的限制,限制从SQLite的读取BLOB的能力。我知道你可能会说我们不应该在数据库中存储BLOB,但是根据定义,BLOB被认为是二进制大对象,并且如果不需要将它们存储在数据库中,则不需要在任何数据库引擎中实现这种对象类型。访问大型BLOB没有光标

然而上光标的执行的1 MB的限制,似乎是在几乎所有情况下不足。我需要将SQL数据库中的二进制数据存储在SQLite数据库中,并且它们都超过1 MB。 SQLite能够完美地处理BLOB,因为C API在Xcode(iPhone平台)中工作得非常好,可以毫无问题地检索大对象。

我的问题是,如果我们所能访问的Android BLOB数据,而无需使用游标。我正在考虑对Java中的Sqlite进行较低级别的访问。有什么建议么?

回答

6

如CL提到的,使用NDK的确是通过在Java语言C语言本身访问sqlite的一种方式。然而,我意识到如果我想自己编写一个自定义的包装并尝试访问Java中的函数,它可能会变得非常混乱。

周围搜索后,我碰到叫Sqlite4java辉煌的开源项目,它是围绕sqlite的紧密包装,编译成各种平台,包括Android上使用。该库允许您与Sqlite进行交互,而无需使用Android Cursor,从而消除了限制。

我能够在480毫秒内检索20 MB的Blob。这比通过Cursors从Sqlite读取一条小记录还要快。我相信这可以用来通过跳过使用Cursor来增强对Sqlite的任何查询。这里是链接到这个伟大的图书馆:http://code.google.com/p/sqlite4java/

+0

在我的情况下,我有很多大小在10kb到1MB之间的blob。将使用mentoined NDK(sqlite4java)给我更好的阅读我的斑点使用光标保证性能? –

+1

Sqlite4Java已经搬到这里https://bitbucket.org/almworks/sqlite4java –

+0

@over_optimistic感谢您的更新! – Bms270

0

Android的Java API始终具有1 MB的限制。

您不应将该大小的BLOB存储在数据库中;文件系统在处理它们时更加高效。

如果你真的想使用BLOB的,你必须要经过NDK直接访问C API。

+0

谢谢,我想我需要寻找到NDK。不使用BLOB的建议并不总是一个正确的建议。如果数据库引擎支持BLOB数据类型并且可以处理它,那么我不明白为什么我们应该尝试证明SDK的缺陷,建议不要使用SQLite引擎实际支持的BLOB。 – Bms270

+0

Android Java API不支持大型Blob。 –

+0

正确。我仍然试图通过NDK来实现这一点。我有一个解决方法后,我会在这里更新。 – Bms270