游标索引超出绑定异常0 android

时间:2015-01-17 13:28:27

标签: android database sqlite

我开发了一个Android应用程序,它有一本小书的内容..该应用程序可以选择"继续阅读"在" onback press"和"暂停"它将页面和其他信息存储在共享首选项中,并在按下继续阅读时检索它们...但它显示"游标索引超出范围异常"使用此选项时,索引0请求大小为0并强制关闭应用程序。我希望它至少保持一段时间...... 代码在其他应用程序中工作正常,但在这里显示异常

这是澄清问题的原因:

1:通常在设备上安装apk文件并打开要阅读的文本。

2:用户按下后退按钮并转到应用程序的其他部分,如设置或....

3:用户按"继续阅读"在关闭APP之前#34;应用程序可以检索他正在阅读的内容。

4:用户关闭应用。

5:再次打开并按"继续阅读"

6:app无法检索文本并强行关闭。

或:

1:在模拟器中从eclipse运行应用程序。

2:只要代码打开并从eclipse运行,它就能完成所有工作。

3:关闭仿真器或断开与eclips的连接。

4:运行模拟器。

5:打开应用程序并按"继续阅读"。

6:强行关闭。

这是我的" TextShow"类:

protected void onCreate(Bundle savedInstanceState) {
load(book,name,Page2);
}
private void load(String sea,String Name,int page3){
db.open();
titr.setText(Name);
matn.setText(db.main_display("content", sea, Name, page3));
page.setText("page"+ Page2 + "from"+ Page1);
db.close();
}

public void onBackPressed() {

SharedPreferences sp=getApplicationContext().getSharedPreferences("cont",        0);
Editor ed=sp.edit();
ed.clear();
ed.putString("book", book);
ed.putString("name", name);
ed.putInt("page",Page1);
ed.commit();
finish();

}
@Override
protected void onPause() {
SharedPreference sp=getApplicationContext().getSharedPreferences("cont", 0);
Editor ed=sp.edit();
ed.clear();
ed.putString("book", book);
ed.putString("name", name);
ed.putInt("page",Page1);
ed.commit();
super.onPause();
}

这是我的主要课程:

ImageView cont=(ImageView) findViewById(R.id.cont);
cont.setOnClickListener(new OnClickListener() {

public void onClick(View arg0) {
sp=getApplicationContext().getSharedPreferences("cont", 0);
    if(sp.getString("name", "*")!="*"){
        Intent i=new Intent(Main.this,TextShown.class);
        i.putExtra("book",sp.getString("book", "*"));
        i.putExtra("name",sp.getString("name", "*"));
        i.putExtra("page",sp.getInt("page", 0)+"");
        startActivity(i);
        overridePendingTransition(R.anim.in, R.anim.out);

            }else{
                Toast.makeText(getApplicationContext(), "there is no ending point", Toast.LENGTH_LONG).show();
            }


        }

    });

这是我的数据库类...检索文本的方法:

public String main_display(String table,String sea,String name,int page){
    Cursor cu=mydb.rawQuery("select * from "+table+" where BookName='"+sea+"' and StoryName='"+name+"' and Page="+page, null);
    cu.moveToFirst();
    String s=cu.getString(4);
    return s;

}

2 个答案:

答案 0 :(得分:1)

添加一项检查以查看游标是否包含项目:

if (cu.moveToFirst()) {
    String s=cu.getString(4);
} else {
    Log.e("TAG", "Cursor empty!");
}

答案 1 :(得分:1)

例外情况说,无法找到索引4处的数据,因为它不是有效的索引。请注意,索引从0开始。

以下是一些避免suche错误的一般性改进:

1。)从光标检索数据时不应使用硬编码索引,因为您可以轻松搞砸它们。而不是你应该创建一个类,它只是将列名保存为字符串常量。然后您可以按如下方式定义表:

private static final String CREATE_TABLE_LOGIN = "CREATE TABLE IF NOT EXISTS "
    + LoginColumns.TABLE_NAME + "(" + LoginColumns._ID + " INTEGER PRIMARY KEY autoincrement, "
    + LoginColumns.KEY_LOGIN_ABCOCOE + " VARCHAR(100) NOT NULL, "
    + LoginColumns.KEY_LOGIN_VALID + " INTEGER NOT NULL);";

2。)你应该总是添加一个检查来查看光标是否有项目并使用列名而不是普通索引。

public String main_display(String table,String sea,String name,int page){
    Cursor cu=mydb.rawQuery("select * from "+table+" where                               BookName='"+sea+"' and StoryName='"+name+"' and Page="+page, null);
    if (cu.moveToFirst()){
        // just an example
        String s=cu.getString(cursor.getColumnIndex(LoginColumns.KEY_LOGIN_ABCOCOE)
        return s;
    }
    return null;
}

如果这不能解决您的问题,请提供更多信息,例如stacktrace等。