Android SQLiteDatabase中的游标大小限制
我从网上下载了一个数据库。我把它保存在我的数据文件夹中,然后打开它。Android SQLiteDatabase中的游标大小限制,android,cursor,size,blob,limit,Android,Cursor,Size,Blob,Limit,我从网上下载了一个数据库。我把它保存在我的数据文件夹中,然后打开它。 在数据库中有一个包含6个字段的表“Ads”。其中2个字段是BLOB。当我想从这张桌子上读的时候。。。我有一些问题。。。我注意到,当我读取一个blob字段大于1兆字节的行时,这会导致异常。。。“从第0行第0列获取字段插槽失败”。如果是一个小斑点,一切都好。。。提前感谢:)由于动态解压缩,内部资产有1MB的限制;1MB的限制似乎也适用于游标blob,但这似乎在任何地方都没有记录 通常,您应该避免SQLite中的blob,因为它们的
在数据库中有一个包含6个字段的表“Ads”。其中2个字段是BLOB。当我想从这张桌子上读的时候。。。我有一些问题。。。我注意到,当我读取一个blob字段大于1兆字节的行时,这会导致异常。。。“从第0行第0列获取字段插槽失败”。如果是一个小斑点,一切都好。。。提前感谢:)由于动态解压缩,内部资产有1MB的限制;1MB的限制似乎也适用于游标blob,但这似乎在任何地方都没有记录
通常,您应该避免SQLite中的blob,因为它们的性能很差;而是将blob数据保存为文件,并将文件的位置存储在数据库中。您使用的查询是“选择”所述blob吗?你能省略它吗?如果不能,您是否正在使用:
blob = rs.getBlob(column) ;
InputStream in = blob.getBinaryStream();
或
第一种方法将允许您分块读取blob。第二个是一次加载所有blob。看起来Android中的blob支持还没有实现 BLOB字段中存储了哪些数据?我猜是照片 我建议不要使用blob。对于二进制数据,文件系统是一个更好的选择
你能再解释一下你想用数据库完成什么吗?每个操作有1MB的限制。(对于SQLite查询,我不确定这是每行还是每列)。该限制是由于SQLite API通过活页夹/包裹IPC系统与SQLite进程外交互造成的。同样的限制也适用于捆绑包中的值(例如,intentextras) 活页夹事务缓冲区具有有限的固定大小,当前为1Mb, 由流程的所有正在进行的事务共享
请参阅:从SQLite数据库中读取小于100KB的BLOB比从文件系统中读取要快。但是,任何大于此值的内容最好保存在磁盘上,并在数据库中提供一个引用。
更多信息:一般来说,您应该避免SQLite中的blob,因为它们的性能很差;而是将blob数据保存为文件,并将文件的位置存储在数据库中。-->非常感谢..AndroidKid是对的。我确信BLOB存在一个用例,但是我想不出一个更好的答案是:不要在任何数据库中使用blob。RDBMs并不特别适合存储大块未格式化的数据——这就是文件系统的用途。@David Souther谢谢你的评论,你说得对。我认为斑点对某些事情有用,这就是为什么我不那么确定的原因。然而,我想不出一个好的用例。存储BluRay电影?(开玩笑)那篇文章是从2007年开始的。BLOB是绝对受支持的,并且至少从1.6开始就得到了支持(又称API级别4,又称甜甜圈)。正如OP所指出的,问题在于BLOB值超过1MB。现代文件系统也是数据库,所以DB怎么不是二进制数据的好地方呢?我不知道“一次加载所有数据”是什么意思。假设
getBlob()
返回一个byte[]
,数据已经在堆上了……假设您的rs
是一个游标,那么由于游标窗口的大小,对getBlob()的第一次调用将在大数据上失败。谢谢您的参考。@frederick nyawaya:最好的方法是什么?将图像/音频作为Blob存储在数据库中或仅存储文件系统的路径?@Ajay作为文件系统的一部分1 MB限制是光标窗口的最大大小。这是用于存储IPC传输结果行的内存缓冲区。窗口大小将动态增长到此限制。
blob.getBytes(1, lengthOblob) ;