android.database.CursorIndexOutOfBoundsException: 请求索引 0,大小为 0
Posted
技术标签:
【中文标题】android.database.CursorIndexOutOfBoundsException: 请求索引 0,大小为 0【英文标题】:android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0 【发布时间】:2012-05-01 22:05:40 【问题描述】:我正在使用自定义适配器扩展光标适配器在列表视图中显示数据,以显示特定的电话号码,我已将 id 传递给数据库类中的方法,但它正在显示
errorandroid.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
在将调试器放在方法中时,它不会在行之后
num = cursor.getString(cursor.getColumnIndex("ContactNumber"));
谁能帮我解决。 这是代码:
public String getNumberFromId(int id)
String num;
db= this.getReadableDatabase();
Cursor cursor = db.query(scheduletable, new String[] "ContactNumber" ,"_id="+id, null, null, null, null);
cursor.moveToFirst();
num = cursor.getString(cursor.getColumnIndex("ContactNumber"));
cursor.close();
db.close();
return num;
【问题讨论】:
【参考方案1】:每当您处理游标时,请始终检查 null 并检查 moveToFirst()
不会失败。
if( cursor != null && cursor.moveToFirst() )
num = cursor.getString(cursor.getColumnIndex("ContactNumber"));
cursor.close();
适当地放置日志以查看它是返回null
还是空游标。根据该检查您的查询。
更新将两个检查放在一个语句中,正如 Jon 在下面的评论中提到的那样。
更新 2 将 close()
调用置于有效游标范围内。
【讨论】:
错了,如果 cursors 为 null 并且你关闭了这个 cursor,你就变成了 NPE 我不知道我当时是怎么错过的。接得好。谢谢! 这段代码对我有用...我确实想要那个。 如果cursor != null
为真,而cursor.movetofirst()
为假,则无法访问cursor.close()
。在这种情况下,您似乎仍想关闭光标,这是不好的做法?除非moveToFirst()
总是返回true?【参考方案2】:
试试这个..这将避免在光标为空时抛出异常..
if(cursor != null && cursor.moveToFirst())
num = cursor.getString(cursor.getColumnIndex("ContactNumber"));
cursor.close();
【讨论】:
这段代码对我有用...我确实想要那个。 如果 cursor 为空,此代码将在 cursor.close() 上崩溃。 @AkashAgarwal 类似于检查计数是否大于零。只需确保光标也不为空。if(cursor != null && cursor.getCount()!= 0)
【参考方案3】:
取数据前先检查这个Condition
if(cursor!=null && cursor.getCount()>0)
cursor.moveToFirst();
num = cursor.getString(cursor.getColumnIndex("ContactNumber"));
【讨论】:
【参考方案4】:在尝试从光标读取任何内容之前,请检查 moveToFirst()
的返回值。看起来好像没有返回任何结果。
【讨论】:
【参考方案5】:用于查询Cursor
s 的保存模式是
// just one
Cursor cursor = db.query(...);
if (cursor != null)
if (cursor.moveToFirst())
value = cursor.getSomething();
cursor.close();
// multiple columns
Cursor cursor = db.query(...);
if (cursor != null)
while (cursor.moveToNext())
values.add(cursor.getSomething());
cursor.close();
【讨论】:
【参考方案6】:如果人们还在寻找:
尝试搜索Phone.NUMBER
,而不是搜索"ContactNumber"
。本教程有更详细的代码:http://developer.android.com/training/basics/intents/result.html
【讨论】:
【参考方案7】:尝试卸载该应用程序,然后再次对其进行测试...实际上 sqlite db 仅在首次安装应用程序时创建一次...因此,如果您认为您的逻辑是最新的,那么重新安装应用程序就可以解决问题你。 !!!!
【讨论】:
以上是关于android.database.CursorIndexOutOfBoundsException: 请求索引 0,大小为 0的主要内容,如果未能解决你的问题,请参考以下文章