0

在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
4

1 回答 1

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意图的调用。

于 2012-05-21T14:52:23.850 回答