Android 在listview中单击某个项时,如何获取sqlite数据库中表的行id

Android 在listview中单击某个项时,如何获取sqlite数据库中表的行id,android,sqlite,listview,android-listview,onitemclicklistener,Android,Sqlite,Listview,Android Listview,Onitemclicklistener,我的代码在这里。。。。。。。。。。。。。!当有一行从列表视图中删除时。listview行的索引已更改,但数据库中的主键id未更改。现在,当我单击该项并将listview中已单击项的位置传递给新活动时。并尝试检索具有该ID的记录—它不会返回某些信息或返回不正确的数据。现在,我的问题是如何在数据库中检测listview的单击项的行id。 现在,在onItemclick方法中应该编写什么代码来从数据库中检索正确的行 谢谢你的反对 protected void onCreate(Bundle saved

我的代码在这里。。。。。。。。。。。。。!当有一行从列表视图中删除时。listview行的索引已更改,但数据库中的主键id未更改。现在,当我单击该项并将listview中已单击项的位置传递给新活动时。并尝试检索具有该ID的记录—它不会返回某些信息或返回不正确的数据。现在,我的问题是如何在数据库中检测listview的单击项的行id。 现在,在onItemclick方法中应该编写什么代码来从数据库中检索正确的行

谢谢你的反对

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    myDb = new DBHelper(this);
    titles = myDb.getAllNames();
    times =  myDb.getAllTimes();

    ArrayAdapter<String> ad = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, titles);
    lv = (ListView) findViewById(R.id.listView1);
    lv.setAdapter(ad);

    lv.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) 
        {

        }
    });



}
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myDb=新的DBHelper(this);
titles=myDb.getAllNames();
times=myDb.getAllTimes();
ArrayAdapter ad=新的ArrayAdapter(这是android.R.layout.simple\u list\u item\u 1,标题);
lv=(ListView)findViewById(R.id.listView1);
低压设置适配器(ad);
lv.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(适配器视图arg0、视图arg1、内部位置、长arg3)
{
}
});
}

首先,您必须在数据库中编写查询并检索id。您必须在光标中返回id

请参阅以下代码段:

public Cursor fetchAllNames() {

        Cursor mCursor = app.myDbHelper.MyDB().query("cardlist", new String[] {"cardid as _id","cardname","carddesc"},
                null, null, null, null, null);
        try{

            if (mCursor != null) {
                mCursor.moveToFirst();
            }
            return mCursor;
        }catch(Exception e)
        {
            return mCursor;
        }

    }
然后在java页面中:

Cursor cursor = myDB.fetchAllNames();
然后,您可以通过以下方式获取数据库id:

 lv.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) 
        {
      if(cursor!=null){
                    System.out.println("position===>"+position);
                    if(cursor.moveToFirst()){
                        cursor.moveToPosition(position);   
                        String cardid =    cursor.getString(cursor.getColumnIndex("_id"));

                    }
                }
        }
    });
lv.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(适配器视图arg0、视图arg1、内部位置、长arg3)
{
如果(光标!=null){
System.out.println(“位置===>”+位置);
if(cursor.moveToFirst()){
光标。移动位置(位置);
String cardid=cursor.getString(cursor.getColumnIndex(“\u id”);
}
}
}
});

您将在字符串cardid中获得数据库id。如果您使用的是SimpleCursorAdapter,则必须使用\u id,否则必须\u id替换为sqlite数据库中表示您id的列名的id。

有一种简单的方法可以实现这一点: 首先,创建一个对象来表示数据库中的一行。因为我不知道你的数据库包含什么,所以我们就叫它“Title”

然后,创建一个自定义适配器。它将存储一个标题集合,允许您在单击某个项目时获取该标题

public class TitlesAdapter extends ArrayAdapter<Title> {
    private Context context;
    private List<Title> items;

    public TitlesAdapter(Context context, List<Title> items) {
        super(context, R.layout.row_draweritem, items);

        this.context = context;
        this.items = items;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) { /* ... */ }
}
。。。并定义您的侦听器,以便可以在数据库中获取行id

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        long id = titlesAdapter.getItems().get(i).getId();
    }
});
listView.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
公共无效onItemClick(AdapterView AdapterView、View视图、int i、long l){
long id=titleAdapter.getItems().get(i).getId();
}
});

您可以在本文中了解有关自定义适配器的更多信息:

您必须为此使用游标的概念感谢@hanishharmathanks引用@chteuchteu的概念!这允许您在查询数据库之前获取有关标题的信息,这很好(从性能角度看)
this.titlesAdapter = new TitlesAdapter(context, titles);
listView.setAdapter(this.titlesAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        long id = titlesAdapter.getItems().get(i).getId();
    }
});