Android基于listview id从数据库获取单行

Android基于listview id从数据库获取单行,android,database,listview,android-listview,cursor,Android,Database,Listview,Android Listview,Cursor,我有一个列表视图,其中包含位置。每个位置都包含纬度、经度和日期。我基本上想要的是点击一个listview项目,并根据其listviewID从我的数据库中检索项目latitude值。我设置了getCoordinatesLatitude()函数,但我不知道我的代码是否正确,因为当我点击一个listview项目时,我会强制关闭,而logcat会显示nullPointerException。我怎样才能做到这一点?谢谢 我的listview是什么样子的 更新 我设法消除了nullPointerExcep

我有一个
列表视图
,其中包含
位置
。每个位置都包含纬度、经度和日期。我基本上想要的是点击一个
listview
项目,并根据其
listview
ID从我的数据库中检索项目
latitude
值。我设置了
getCoordinatesLatitude()
函数,但我不知道我的代码是否正确,因为当我点击一个
listview
项目时,我会强制关闭,而logcat会显示
nullPointerException
。我怎样才能做到这一点?谢谢

我的listview是什么样子的

更新 我设法消除了nullPointerException错误,并将代码更改为

//function which is in my DatabaseHelper class which extends SQLiteOpenHelper
public String getCoordinatesLatitude(int id) {
    String rowLat = "";
    SQLiteDatabase db = this.getReadableDatabase();
    String latQuery = "SELECT " + KEY_LATITUDE + "FROM " + TABLE_COORDINATES + "WHERE " + KEY_ID + "=" + id;
    Cursor cursorr = db.rawQuery(latQuery,null);
    if (cursorr != null){
        cursorr.moveToPosition(id);
        rowLat = cursorr.getString(cursorr.getColumnIndex(KEY_LATITUDE));
    }

    // return coordinates
    return rowLat;
}

//function in my main activity
public void onListItemClick(ListView l, View v, int position, long id) {

      selectedFromList = (String) (l.getItemAtPosition(position));
      selectedItem = (int) l.getItemIdAtPosition(position);
      String rowLat = helper.getCoordinatesLatitude(selectedItem);
      Toast.makeText(getApplicationContext(), rowLat, Toast.LENGTH_SHORT).show();

      }

但现在,当我单击listview项时,找不到toast,因此它在if(cursor.moveToFirst())语句中停止,因为光标为空。当我的listview中充满项目时,光标怎么可能为空P

更新2
我只需将查询更改为Cursor=db.query(TABLE_坐标,新字符串[]{KEY_DATE},null,null,null,null,null),就解决了这个问题;其中KEY_DATE是您在单击listview中的项目时希望显示的列名

如果分配给listview适配器的数组是“array”,则可以检索array.get(position).getLatitude();(我假设您使用了自定义适配器)

首先,您的表必须有一个名为_idnot id的列设置为主键。然后,您可以将从onItemClick获得的id传递给getLatitudeFromId

将getLatitudeFromId(长id)更改为:

 public void onListItemClick(ListView l, View v, int position, long id) {
    DatabaseHelper helper = new DatabaseHelper(this);
    selectedFromList = (String) (l.getItemAtPosition(position));
    selectedItem = l.getItemIdAtPosition(position);
    String rowLat = helper.getLatitudeFromId(selectedItem);
    Toast.makeText(getApplicationContext(), rowLat, Toast.LENGTH_SHORT).show();
}
 public String getLatitudeFromId(long id) {
    String rowLat = "not found";

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.query(TABLE_COORDINATES, new String[] { "latitude" },"_id=" + id, null, null, null,null);
    if (cursor.moveToFirst()){
        rowLat = cursor.getString(cursor.getColumnIndex("latitude"));
    }
    cursor.close();
    db.close();

    // return coordinates
    return rowLat;
}  
仅更改列表项单击此处:

 public void onListItemClick(ListView l, View v, int position, long id) {
    DatabaseHelper helper = new DatabaseHelper(this);
    selectedFromList = (String) (l.getItemAtPosition(position));
    selectedItem = l.getItemIdAtPosition(position);
    String rowLat = helper.getLatitudeFromId(selectedItem);
    Toast.makeText(getApplicationContext(), rowLat, Toast.LENGTH_SHORT).show();
}
 public String getLatitudeFromId(long id) {
    String rowLat = "not found";

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.query(TABLE_COORDINATES, new String[] { "latitude" },"_id=" + id, null, null, null,null);
    if (cursor.moveToFirst()){
        rowLat = cursor.getString(cursor.getColumnIndex("latitude"));
    }
    cursor.close();
    db.close();

    // return coordinates
    return rowLat;
}  

注意:l.getItemAtPosition(position)返回一个视图,而不是string,也不是int,我实际上已经解决了这个问题。奇怪的是,我把我的问题改成了这个 Cursor Cursor=db.query(表坐标,新字符串[]{KEY\u DATE},null,null,null,null,null);
只是让选择为null,并且只拥有我想要的列,它就成功了!此问题可以标记为已回答。

我想要的是单击listview,将其位置存储到selectedItem,然后将selectedItem传递到我的GetCoordinationsLatitude(selectedItem);然后该函数将搜索我的数据库并返回id等于selectedItem的纬度,但我不知道我的函数是否正确我没有使用自定义适配器,但这不是重点。我需要一个函数,该函数将扫描我的数据库并从与我的SelectedItem具有相同id的行返回纬度,该查询将返回数据库中的所有行。似乎只有在第一个列表项被选中或所有行都相等时才有效,我知道这似乎是一种奇怪的情况,不是吗?我用不同的坐标对它进行了测试,它就像charmNow一样工作,因为cursor.moveToPosition可以工作,但是在删除一些行并添加其他行之后,它就停止工作了。