Cursor 遍历数据库,莫名其妙出现异常

时间:2022-01-25 22:55:25
Cursor 遍历数据库,莫名其妙出现异常

大体代码:

Cursor cur = getContentRessolver().query(....);
.....
....

int ColNum = cur.getCoumnCount();  // 运行时,获取到的值是41

String val = null;

while(cur.MoveNext())
{
   for(int i = 0; i < ColNum; i++)
   {
       val = cur.getString(i);   // 此处,在外层while循环进行第四轮时,i = 10时程序崩溃,如果跳过10,i = 11或更大,均不会出现崩溃。

       ....
       ...
   }
}

注释处是出错原因现象,这种错误让我感到迷惑,已经在多次遇到这样的错误了
要命的是,错误我无法预知,根本不给我处理错误的机会,程序就报异常了
哪位处理过类似的问题,指导一下,不胜感激额!

我是在读联系人数据库时出现的上述错误。
分不多了,全部奉上
       

12 个解决方案

#1


是什么异常

#2


看看Logcat里写的什么异常。
自己在adb shell里进入到数据库手动查看下是不是数据问题。

#3


不是应该 moveToFirst,然后使用 do{}while(cur.moveToNext()); 循环的么,是不是忘记 moveToFirst 了?

加 try{}catch(Exception e){e.printStackTrace();}了没?

#4


引用 1 楼 vincevincevincevince 的回复:
是什么异常

就是程序直接崩溃,用Try Catch 无法捕获的错误,有处理办法吗?

#5


引用 2 楼 t5721654 的回复:
看看Logcat里写的什么异常。
自己在adb shell里进入到数据库手动查看下是不是数据问题。

非Root手机,无法查看数据库文件啊,不知道你说的是这个意思吗?

#6


引用 3 楼 lazy_2010 的回复:
不是应该 moveToFirst,然后使用 do{}while(cur.moveToNext()); 循环的么,是不是忘记 moveToFirst 了?

加 try{}catch(Exception e){e.printStackTrace();}了没?

调用MoveToFirst了,我的错误不是出现在这里,具体现象如下:
val = cur.getString(i); // 此处,在外层while循环进行第四轮时,i = 10时程序崩溃,如果跳过10,i = 11

这错误try catch捕获不到啊,所以我上层无法处理

你在啊,能否用

QQ交流一下?36367977

#7


看看 getColumnName(10) 是什么,或许是数据类型不正确,试一试 isNull(10)呢?

要不,是 blob 数据导致内存溢出了?

#8


try catch 应该是可以捕获的,要用Exception e 。才能捕获所有异常。

#9


val = cur.getString(i);
那是因为你需要一个不是string的数据类型,可能。
或者数据库中第四行第十一行的数据有错误。

#10


你把你的有关cursor操作的全部语句或者直接这个方法体中的全部语句都放到try catch中。
try {
全部语句
} catch(Exception e) {
System.out.println("cursor is exception " + e.getMessage());
e.printStackTrace();
} finally {
cursor.close();
}
不可能抛不出异常还崩了,把异常传上来看看。要是抛不出那就是Sqlite自身的问题了。

#11


引用 9 楼 yang79tao 的回复:
val = cur.getString(i);
那是因为你需要一个不是string的数据类型,可能。
或者数据库中第四行第十一行的数据有错误。


getLong()也报同样的错误,数据有错误该怎么办呢?

#12


  已解决,Try Catch可以捕获到异常,结贴

#1


是什么异常

#2


看看Logcat里写的什么异常。
自己在adb shell里进入到数据库手动查看下是不是数据问题。

#3


不是应该 moveToFirst,然后使用 do{}while(cur.moveToNext()); 循环的么,是不是忘记 moveToFirst 了?

加 try{}catch(Exception e){e.printStackTrace();}了没?

#4


引用 1 楼 vincevincevincevince 的回复:
是什么异常

就是程序直接崩溃,用Try Catch 无法捕获的错误,有处理办法吗?

#5


引用 2 楼 t5721654 的回复:
看看Logcat里写的什么异常。
自己在adb shell里进入到数据库手动查看下是不是数据问题。

非Root手机,无法查看数据库文件啊,不知道你说的是这个意思吗?

#6


引用 3 楼 lazy_2010 的回复:
不是应该 moveToFirst,然后使用 do{}while(cur.moveToNext()); 循环的么,是不是忘记 moveToFirst 了?

加 try{}catch(Exception e){e.printStackTrace();}了没?

调用MoveToFirst了,我的错误不是出现在这里,具体现象如下:
val = cur.getString(i); // 此处,在外层while循环进行第四轮时,i = 10时程序崩溃,如果跳过10,i = 11

这错误try catch捕获不到啊,所以我上层无法处理

你在啊,能否用

QQ交流一下?36367977

#7


看看 getColumnName(10) 是什么,或许是数据类型不正确,试一试 isNull(10)呢?

要不,是 blob 数据导致内存溢出了?

#8


try catch 应该是可以捕获的,要用Exception e 。才能捕获所有异常。

#9


val = cur.getString(i);
那是因为你需要一个不是string的数据类型,可能。
或者数据库中第四行第十一行的数据有错误。

#10


你把你的有关cursor操作的全部语句或者直接这个方法体中的全部语句都放到try catch中。
try {
全部语句
} catch(Exception e) {
System.out.println("cursor is exception " + e.getMessage());
e.printStackTrace();
} finally {
cursor.close();
}
不可能抛不出异常还崩了,把异常传上来看看。要是抛不出那就是Sqlite自身的问题了。

#11


引用 9 楼 yang79tao 的回复:
val = cur.getString(i);
那是因为你需要一个不是string的数据类型,可能。
或者数据库中第四行第十一行的数据有错误。


getLong()也报同样的错误,数据有错误该怎么办呢?

#12


  已解决,Try Catch可以捕获到异常,结贴