在没有光标的Android Sqlite中访问大型BLOB

时间:2013-06-25 14:43:22

标签: java android sqlite cursor blob

Android的Cursor Window大小似乎有1MB的限制,这限制了从SQLite读取BLOB的能力。我知道您可能会说我们不应该将BLOB存储在数据库中,但根据定义,BLOB被视为二进制大对象,如果不需要将它们存储在数据库中,则无需在任何数据库引擎中实现此类对象类型。

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

我的问题是,如果我们可以在不使用游标的情况下访问Android中的BLOB数据。我正在考虑在Java中对Sqlite进行较低级别的访问。有什么建议吗?

3 个答案:

答案 0 :(得分:7)

正如CL所提到的,使用NDK确实是一种通过Java语言中的C语言本地访问Sqlite的方法。但是我意识到如果我想自己编写一个自定义包装器并尝试访问Java中的函数,它可能会变得非常混乱。

在搜索之后,我遇到了一个名为Sqlite4java的开源项目,这是一个围绕Sqlite的紧密包装,编译后可以在包括Android在内的各种平台上使用。该库允许您在不使用Android Cursor的情况下与Sqlite进行交互,从而消除了限制。

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

答案 1 :(得分:0)

Android的Java API总是有1 MB的限制。

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

如果您真的想使用BLOB,则必须通过NDK直接访问C API。

答案 2 :(得分:0)

实际上有一种解决方案,而不依赖于针对Android的SQLite包装器的不同实现!

Retrieve large blob from Android sqlite database