Java SQLite中的CursorIndexOutOfBoundsException(请求索引20,大小为20)

Java SQLite中的CursorIndexOutOfBoundsException(请求索引20,大小为20),java,android,sqlite,exception,Java,Android,Sqlite,Exception,我收到一个错误“android.database.CursorIndexOutOfBoundsException:请求索引20,大小为20”,我无法理解到底是什么导致了它以及如何修复它?c.moveToFirst()和c.moveToNext()可能有问题 public类MainActivity扩展了AppCompatActivity{ Map articleURLs=newhashmap(); Map articleTitles=新建HashMap(); ArrayList ArticleId

我收到一个错误“android.database.CursorIndexOutOfBoundsException:请求索引20,大小为20”,我无法理解到底是什么导致了它以及如何修复它?c.moveToFirst()和c.moveToNext()可能有问题

public类MainActivity扩展了AppCompatActivity{
Map articleURLs=newhashmap();
Map articleTitles=新建HashMap();
ArrayList ArticleId=新的ArrayList();
sqlitedatabasearticlesdb;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
articlesDB=this.openOrCreateDatabase(“Articles”,MODE_PRIVATE,null);
execSQL(“如果不存在项目,则创建表(id INTEGER主键、articleId INTEGER、url VARCHAR、title VARCHAR、content VARCHAR)”;
DownloadTask任务=新建DownloadTask();
试一试{
字符串结果=任务。执行(“https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty).get();
JSONArray JSONArray=新JSONArray(结果);
articlesDB.execSQL(“从条款中删除”);
对于(int i=5;i{
受保护的字符串doInBackground(字符串…URL){
字符串结果=”;
网址;
HttpURLConnection-urlConnection=null;
试一试{
url=新url(url[0]);
urlConnection=(HttpURLConnection)url.openConnection();
InputStream in=urlConnection.getInputStream();
InputStreamReader reader=新的InputStreamReader(in);
int data=reader.read();
while(数据!=-1){
当前字符=(字符)数据;
结果+=电流;
data=reader.read();
}
}
捕获(例外e){
e、 printStackTrace();
}
返回结果;
}
}     
}
更改以下代码

Cursor c = articlesDB.rawQuery("SELECT * FROM articles",null);
int articleIdIndex = c.getColumnIndex("articleId");
int urlIndex = c.getColumnIndex("url");
int titleIndex = c.getColumnIndex("title");

c.moveToFirst();
while (c!= null){
Log.i("articleIdIndex", Integer.toString(c.getInt(articleIdIndex)));
Log.i("articleUrl",c.getString(urlIndex) );
Log.i("titleTitle",c.getString(titleIndex));
c.moveToNext();
}
以下

Cursor c = articlesDB.rawQuery("SELECT * FROM articles",null);
int articleIdIndex = c.getColumnIndex("articleId");
int urlIndex = c.getColumnIndex("url");
int titleIndex = c.getColumnIndex("title");

if(c.moveToFirst())
do{
     Log.i("articleIdIndex", Integer.toString(c.getInt(articleIdIndex)));
     Log.i("articleUrl",c.getString(urlIndex) );
     Log.i("titleTitle",c.getString(titleIndex));
}while(c.moveToNext());

将下面的行更改为

c.moveToFirst();
while (c!= null){
    Log.i("articleIdIndex", Integer.toString(c.getInt(articleIdIndex)));
    Log.i("articleUrl",c.getString(urlIndex) );
    Log.i("titleTitle",c.getString(titleIndex));
    c.moveToNext();
}

条件
(c!=null)
将始终为
true
,因此,即使数据库中没有更多记录,每次都将执行while循环。因此,请将while循环中的条件更改为
c.moveToNext()
,以便仅当数据库中有更多记录时才会获取记录


它会很好地工作。

而(c!=null)
你认为
c
何时或如何会变成
null
?@DavidMedenjak好的,我理解我的错误,谢谢!
c.moveToFirst();
while (c!= null){
    Log.i("articleIdIndex", Integer.toString(c.getInt(articleIdIndex)));
    Log.i("articleUrl",c.getString(urlIndex) );
    Log.i("titleTitle",c.getString(titleIndex));
    c.moveToNext();
}
while (c.moveToNext()) {
    Log.i("articleIdIndex", Integer.toString(c.getInt(articleIdIndex)));
    Log.i("articleUrl",c.getString(urlIndex) );
    Log.i("titleTitle",c.getString(titleIndex));
}