2013-12-08 143 views
2
//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其中包含locations。每个位置包含latitude,longitude和日期。我基本想要的是点击一个listview项目,并根据其listview ID从我的数据库中检索项目latitude的值。我设置了getCoordinatesLatitude()函数,但我不知道我的代码是否正确,因为当我点击一个listview项目时,我得到强制关闭,logcat显示nullPointerException。我怎样才能做这项工作?由于Android根据列表视图从数据库获取单行ID

什么我的列表视图看起来像 what my listview looks like

UPDATE !!!! 我设法摆脱NullPointerException异常的错误,并改变了我的代码,这

public String getLatitudeFromId(long id) { 
    String rowLat = "not found"; 
    SQLiteDatabase db = this.getReadableDatabase(); 
    //String latQuery = "SELECT " + KEY_LATITUDE + " FROM " + TABLE_COORDINATES + " WHERE " + KEY_ID + "=" + id; 
    //Cursor cursor = db.rawQuery(latQuery,null); 
    Cursor cursor = db.query(TABLE_COORDINATES, new String[] { "latitude" },"id="+id, null, null, null,null); 
    if (cursor.moveToFirst()){ 
     cursor.moveToPosition((int) id); 
     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(); 
} 

但是现在,当我在ListView项单击,面包没有找到,所以它因为光标为空,所以在if(cursor.moveToFirst())语句中停止。当我的列表视图充满项目时,光标如何变为空白? :P

UPDATE2 我只通过改变我的查询该光标的光标= db.query(TABLE_COORDINATES,新的String [] {KEY_DATE},NULL,NULL,NULL,NULL,NULL)固定的问题;其中KEY_DATE是当你单击列表视图时想要显示的列名称

回答

0

我实际上工作出去了。奇怪的是,我改变了我的查询到这个 游标cursor = db.query(TABLE_COORDINATES,new String [] {KEY_DATE},null,null,null,null,null); 只是让选择为空,只有我想要的列,它的工作!这个问题可以标记为已回答。

+0

该查询返回数据库中的所有行。似乎只有在第一个列表项被选中或所有行相同时才有效,看起来是这样的 – ramaral

+0

我知道,那很奇怪不是吗?我用不同的坐标测试它,它的功能就像一个魅力 – trololz0r

+0

现在,因为cursor.moveToPosition,但删除一些行并添加其他人停止工作后。 – ramaral

1

如果您已分配给列表视图适配器的数组是“数组”,那么您可以检索array.get(position).getLatitude (); (我假设你已经使用了自定义适配器)

+0

我想要的是点击listview,将其位置存储到selectedItem,然后将selectedItem传递给我的getCoordinatesLatitude(selectedItem);然后该函数将搜索我的数据库,并返回我纬度的id等于selectedItem,但我不知道我的功能是否正确 – trololz0r

+0

你有没有使用自定义适配器,你可以证明这一点。 – Piyush

+0

我没有使用自定义适配器,但那不是重点。我想要一个函数来扫描我的数据库,并返回与我的selectedItem具有相同ID的行的纬度 – trololz0r

0

首先你的表必须设置一个名为_id not id的主键。然后你可以传递给getLatitudeFromId你从onItemClick获得的id。

变化getLatitudeFromId(长ID),以这样的:

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; 
} 

变化onListItemClick这样:

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(id); 
    Toast.makeText(getApplicationContext(), rowLat, Toast.LENGTH_SHORT).show(); 
} 

注:l.getItemAtPosition(位置)返回一个视图不串既不INT