Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android SQLiteDatabase中的游标大小限制_Android_Cursor_Size_Blob_Limit - Fatal编程技术网

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) ;