Java 在android上将大数据导入sqlite数据库
当我想读取以前保存到数据库中的大型图像(大约10MB)时,我遇到以下错误: 窗口已满:请求分配10052488字节,可用空间 2096638字节,窗口大小2097152字节 java.lang.IllegalStateException:无法从中读取第0行、第0列 游标窗口 但是,在保存图像时,不会发生错误。我使用以下代码行获取值:Java 在android上将大数据导入sqlite数据库,java,android,sqlite,Java,Android,Sqlite,当我想读取以前保存到数据库中的大型图像(大约10MB)时,我遇到以下错误: 窗口已满:请求分配10052488字节,可用空间 2096638字节,窗口大小2097152字节 java.lang.IllegalStateException:无法从中读取第0行、第0列 游标窗口 但是,在保存图像时,不会发生错误。我使用以下代码行获取值: value=cursor.getString(fieldIndex) 阅读让我相信,除了不将图像保存到数据库之外,没有其他解决方案。然而,我的日程安排很紧,修改这部
value=cursor.getString(fieldIndex)代码>
阅读让我相信,除了不将图像保存到数据库之外,没有其他解决方案。然而,我的日程安排很紧,修改这部分代码将花费我相当长的时间,因此,如果有任何方法可以让它工作,我将非常感谢任何提示/破解/解决方法
同一行代码对于较小的图像非常有效(我只是用6MB的图像进行了尝试,没有任何问题),因此我非常确定我的Java代码中没有错误。图像的保存过程也没有任何问题。使用光标后,请像cursor.close()一样关闭它代码>
它适合我。我的应用程序必须将图像保存在SQlite DB中
为了从DB中读取大图像,我开发了以下代码
int lengthCount = 2000000;
Cursor res = db.rawQuery("SELECT * FROM attributes WHERE length(image) < " + lengthCount + " and fk_feature = '" + idFeatures + "' AND cancel = 0 ORDER BY last_sync DESC", null);
res.moveToFirst();
while (!res.isAfterLast()) {
//...
// if length (image) <lengthCount no read errors occur
//...
res.moveToNext();
}
res.close();
Cursor r = db.rawQuery("SELECT id, length(image) FROM nameTable WHERE length(image) > " + lengthCount, null);
r.moveToFirst();
int startCount = 0;
while (!r.isAfterLast()) {
MyClassImage item = new MyClassImage();
item.id = r.getString(r.getColumnIndex("id"));
int lengthImage = r.getInt(r.getColumnIndex("length(image)"));
while (lengthImage > startCount) {
Cursor r1;
if (lengthImage > (startCount + lengthCount)) {
r1 = db.rawQuery("SELECT substr(image, " + startCount + ", " + lengthCount + ") as x FROM attributes WHERE id ='" + item.id + "'", null);
} else {
r1 = db.rawQuery("SELECT substr(image, " + startCount + ", " + (lengthImage - startCount) + ") as x FROM attributes WHERE id ='" + item.id + "'", null);
}
r1.moveToFirst();
if (!r1.isAfterLast()) {
if (item.image != null && item.image.length > 0) {
item.image = ByteBuffer.allocate(item.image.length + r1.getBlob(r1.getColumnIndex("x")).length).put(item.image).put(r1.getBlob(r1.getColumnIndex("x"))).array();
} else {
item.image = r1.getBlob(r1.getColumnIndex("x"));
}
}
r1.close();
startCount += lengthCount;
}
int lengthCount=2000000;
Cursor res=db.rawQuery(“从属性中选择*,其中长度(图像)<”+lengthCount+“和fk_特征=”“+idFeatures+”,取消=0顺序,按上次同步描述”,null);
res.moveToFirst();
而(!res.isAfterLast()){
//...
//如果长度(图像)开始计数){
光标r1;
如果(长度图像>(开始计数+长度计数)){
r1=db.rawQuery(“选择substr(图像,“+startCount+”,“+lengthCount+”)作为id=“+item.id+”,null”的属性中的x);
}否则{
r1=db.rawQuery(“选择substr(图像,“+startCount+”,“+(lengthImage-startCount)+”)作为id='“+item.id+”,null的属性中的x);
}
r1.moveToFirst();
如果(!r1.isAfterLast()){
如果(item.image!=null&&item.image.length>0){
item.image=ByteBuffer.allocate(item.image.length+r1.getBlob(r1.getColumnIndex(“x”)).length).put(item.image).put(r1.getBlob(r1.getColumnIndex(“x”)).array();
}否则{
item.image=r1.getBlob(r1.getColumnIndex(“x”);
}
}
r1.close();
startCount+=长度计数;
}
注意:我希望找到一个更优化的解决方案,但目前这是正确的。尝试将文件保存在SD卡中,并将图像的路径保存到db。为什么不保存为BLOB?@SilvansSolanki这正是我想要避免的,因为日程安排很紧,但这可能是一个与设备相关的问题,上面的错误意味着光标已到达他的限制,不同设备的限制不同。一个可能的解决方案可能是将字符串分成块并保存,然后将其放在一起……好的,谢谢。如果我有消息,我会写下回复。