Android:光标超出范围

时间:2012-05-21 14:36:39

标签: java android database cursor

在Android中单击我的列表适配器后,我得到一个光标超出范围异常,显示数据库中的数据。

这是我单击按钮时执行的代码:

@Override
public void onCreate(Bundle contactsState) {
    super.onCreate(contactsState);

 // Set the layout for this activity
    setContentView(R.layout.contacts);
    final Intent openInfo = new Intent(this,contactInfo.class);


    final database info = new database(this);
    info.open();
    getData = info.getData();
    getData.moveToFirst();
    ListAdapter Cview = new SimpleCursorAdapter(this,
                        R.layout.row,
                        getData,
                        new String[]{info.KEY_CONTACT, info.KEY_PHONE},
                        new int[]{R.id.RowText});
    setListAdapter(Cview);

    ListView Vct;
    Vct = getListView();
    Vct.setClickable(true);
    Vct.setOnItemClickListener(new OnItemClickListener(){

        public void onItemClick(AdapterView<?> a,View v,int position,long id){
            Click = (Cursor) a.getItemAtPosition(position);
            getId = Click.getLong(1);
            info.open();
            String Pdata = info.getRows(getId);
            openInfo.putExtra("data",Pdata);
            info.close();
            //Start the Activity
            startActivity(openInfo);


        }
    });

    info.close();

}

这是我管理其中一些代码的数据库的一部分:

    public Cursor getData() {
    // TODO Auto-generated method stub
    String[] columns = new String[]{ KEY_ROWID, KEY_CONTACT, KEY_PHONE, KEY_DAYS};
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);

    return c;
}
public String getRows(long id) {
    // TODO Auto-generated method stub
    String[] columns = new String[]{KEY_ROWID,KEY_CONTACT,KEY_PHONE,KEY_DAYS};
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_ROWID + "=" + id, null, null, null, null);
    String value = c.getString(1) + "\n" + c.getString(2) + "\n" + c.getString(3); 
    return value;
}

这是我得到的错误:

http://paste.ubuntu.com/1000856/

这应该做的是当您在列表视图中单击一个名称中包含数据库中的数据时,它将打开一个传递给它的变量的新活动,该变量将显示信息这个名字的活动。

    Thanks in Advance

1 个答案:

答案 0 :(得分:0)

如果您希望光标的行id与您单击的列表中的位置相关,则它是进入该方法的long id参数。

你可以跳过你正在运行的整个游标问题(并摆脱不必要的代码):

   public void onItemClick(AdapterView<?> a,View v,int position,long id){
        info.open();
        String Pdata = info.getRows(id);
        openInfo.putExtra("data",Pdata);
        info.close();
        //Start the Activity
        startActivity(openInfo);
    }

修改

使用您的更多信息......问题出在您的getRows方法中......在对游标执行任何操作之前,您需要执行moveToFirst()

试试这个:

public String getRows(long id) {
     // TODO Auto-generated method stub
    String[] columns = new String[]{KEY_ROWID,KEY_CONTACT,KEY_PHONE,KEY_DAYS};
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_ROWID + "=" + id, null, null, null, null);
    c.moveToFirst();  // <---- add this
    String value = c.getString(1) + "\n" + c.getString(2) + "\n" + c.getString(3); 
    return value;
}

我的第一个答案也适用于此。

编辑2

看起来你似乎缺少一个意图声明......你正在使用putExtra,但我没有看到创建openInfo意图的调用。