如何跟踪单个标记以更新SQLite中的条目

时间:2017-08-31 00:39:51

标签: android google-maps

我的应用程序允许用户在地图中心的十字线上粘贴,然后添加标记。标记lat,lng以及名称都保存到数据库中,并且工作正常。我没有添加id,因为我的数据库添加了id。

public long addEntry(String theLabel, String theArea, String theLat, String theLng) {
    ContentValues contentValues = new ContentValues();
    contentValues.put(KEY_NAME, theLabel);
    contentValues.put(KEY_AREA, theArea);
    contentValues.put(KEY_LAT, theLat);
    contentValues.put(KEY_LNG, theLng);
    return mySpotsDatabase.insert(DATABASE_TABLE, null, contentValues);

}

到目前为止所有的好处以及在地图的后续加载中我从SQLite数据库获取数据并使用标记填充地图。当我进行检索时,我还包括SQlite条目的id。

public Cursor getAllData() {
    String [] columns = new String [] {KEY_ROWID, KEY_NAME, KEY_AREA, KEY_LAT, KEY_LNG};
    Cursor c = mySpotsDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null);
    c.moveToFirst();
    return c;
}

在我的地图页面

 MySpotsDatabase spotDatabase = new MySpotsDatabase(MyMap.this);
        spotDatabase.open();
        if (spotDatabase.getNumRows() == 0)
            spotDatabase.addEntry("MarkerTitle", "One", myLatitude.toString(), myLongitude.toString());
        spotDatabase.close();

        spotDatabase.open();
        myDataC = spotDatabase.getAllData();
        do {
            dataprovider = new MarkersDataProvider(myDataC.getString(0), myDataC.getString(1), myDataC.getString(2), myDataC.getString(3), myDataC.getString(4));
            arrayList.add(dataprovider);
        } while (myDataC.moveToNext());
        spotDatabase.close();

到目前为止一切都很好,但现在我想更新标记,如果用户将其拖动到另一个位置或者他们想要更新标题标签。

如何设置,获取和恢复单个标记,并将其更新的lat,lng和name写回SQLite数据库。写回SQLite数据库是微不足道的,我已经排序了,但我需要知道我需要更新的SQLite数据库中的哪个条目。

所以我试图找到一种方法来获取我从数据库中读取的每个标记的_id,并使用其标记保留该引用,以便我可以在需要时更新数据库。

ATTEMPT我试过将标记标题设置为_id,但由于某种原因这给了我一个空引用

LatLng newMarker = new LatLng(myLat, myLng);
                        MarkerOptions newOptions = new MarkerOptions();
                        newOptions.position(newMarker);
                        int lastEntry = arrayList.size()-1;
                        String rowID = arrayList.get(lastEntry).getRowID();
                        newOptions.title(rowID);
                        newOptions.draggable(true);
                        String theSnippet = "Marker id: " + arrayList.get(lastEntry).getRowID() + "\nLat: " + String.valueOf(myLat) + "\nLng: " + String.valueOf(myLng);
                        newOptions.snippet(theSnippet);
                        myMap.addMarker(newOptions);
                        Snackbar.make(findViewById(R.id.myMapCoordinatorLayout), rowID + " " + beforeCount + " " + afterCount , Snackbar.LENGTH_INDEFINITE).show();

查看哈希图,但不确定这是否是正确的解决方案。我会继续挖掘,因为如果我可以理清它为什么给我一个空引用,那么在标题中存储_id可能仍然有效。

1 个答案:

答案 0 :(得分:0)

所以我用GrAnd的答案解决了空引用的问题。

Get gererated ID from inserted row

这是我修改的行以获取行ID:

int newRowID = (int) addToDB.addEntry("New Marker", "One", (String.valueOf(myLat)), (String.valueOf(myLng)));

仍然不确定在标题中存储ROWID是否是最好的方法,如果我找到更好的解决方案,我会更新我的答案。

我还发现我的dataprovider类没有返回rowid的字符串值,所以这对我来说是一个新手的错误。

public class MarkersDataProvider {

private String rowID;
private String name;
private String area; // not used but will be later on.  Just set to "one" for now
private String lat;
private String lng;

public MarkersDataProvider(String rowID, String name, String area, String lat, String lng)
{
    this.setRowID(rowID);
    this.setName(name);
    this.setArea(area);
    this.setLat(lat);
    this.setLng(lng);
}

public String getRowID()
{
    return rowID;
}
public String getName()
{
    return name;
}
public String getArea()
{
    return area;
}
public String getLat()
{
    return lat;
}
public String getLng()
{
    return lng;
}


// never set the rowID as it is generated by the database and I only read it so
// I can reference it in updating and deleting markers

public void setRowID(String rowID)
{
    this.rowID = rowID;
}
public void setName(String name)
{
    this.name = name;
}
public void setArea(String area)
{
    this.area = area;
}
public void setLat(String lat)
{
    this.lat = lat;
}
public void setLng(String lng)
{
    this.lng = lng;
}

所以我的计划是不在信息窗口中显示标记标题,以便标题可以存储行ID。