我的应用程序允许用户在地图中心的十字线上粘贴,然后添加标记。标记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可能仍然有效。
答案 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。