android.database.CursorIndexOutOfBoundsException:不知道为什么
我刚刚收到来自使用我的Android应用程序的用户的错误报告。android.database.CursorIndexOutOfBoundsException:不知道为什么
java.lang.RuntimeException: Unable to start activity ComponentInfo{c`om.gurpswu.gurps/com.gurpswu.gurps.Home}: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2669)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2685)
at android.app.ActivityThread.access$2300(ActivityThread.java:126)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2038)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4633)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)
at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214)
at android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java:84)
at com.gurpswu.gurps.Player.getIntField(Player.java:137)
at com.gurpswu.gurps.Home.hudSetup(Home.java:102)
at com.gurpswu.gurps.Home.onCreate(Home.java:25)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2633)
... 11 more`
我还没有能够重新创建问题。我希望你能帮助我。这是我的主屏幕上的代码,从sqlite数据库中检索值。
public String getStringField(String fieldName) {
String[] columns = new String[] { KEY_ROWID, KEY_NAME, KEY_CITY,
KEY_HEALTH, KEY_ENERGY, KEY_RANK, KEY_CASH, KEY_BALANCE,
KEY_DONATED };
Cursor c = ourDatabase.query(true, DATABASE_TABLE, columns, null, null,
null, null, "_id DESC", "1");
if (c != null) {
c.moveToFirst();
String name = c.getString(c.getColumnIndexOrThrow(fieldName));
c.close();
return name;
}
return null;
}
public int getIntField(String fieldName) {
String[] columns = new String[] { KEY_ROWID, KEY_NAME, KEY_CITY,
KEY_HEALTH, KEY_ENERGY, KEY_RANK, KEY_CASH, KEY_BALANCE,
KEY_DONATED };
Cursor c = ourDatabase.query(true, DATABASE_TABLE, columns, null, null,
null, null, "_id DESC", "1");
if (c != null) {
c.moveToFirst();
int result = c.getInt(c.getColumnIndexOrThrow(fieldName));
c.close();
return result;
}
return (Integer) null;
}
,第一行你有CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
。做检查c.getCount()
前c.moveToFirst()
:
if(c != null) {
try {
if (c.getCount() > 0) {
c.moveToFirst();
return c.getInt(c.getColumnIndexOrThrow(fieldName));
}
}
finally {
c.close();
}
}
我的猜测是,你必须检查的c.moveToFirst();
的情况下返回值没有任何记录,这应该调用失败(也许返回“falsy”值)
到底! :)在堆栈跟踪中,第一行有'CursorIndexOutOfBoundsException:索引0请求,大小为0'。在'c.moveToFirst()'之前检查'c.getCount()'# – 2012-07-06 23:37:41
如果什么光标是空的 ?这个如果(C!= NULL):
更换这一点,如果(!C =空& & c.moveToFirst())
@Barak如果由于某种原因,c确实为null。他会得到一个空指针异常与您的建议! – Razvan 2012-07-06 23:38:17
我不相信你需要测试游标是否为空。 [文档](http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#query%28java.lang.String,%20java.lang.String [],%20java.lang.String ,%20java.lang.String [],%20java.lang.String,%20java.lang.String,%20java.lang.String,%20java.lang.String%29)指出query()将返回“A Cursor对象,位于第一个条目之前“。它可能会返回一个_empty_光标,但是一个空的光标不为空。 – Sam 2012-07-06 23:53:05
尝试'c.getCount = C的'0'instead = null'in你'if'声明!。 – Barak 2012-07-06 23:35:45