从数据库加载标记会导致它们的 ID 每次都被重置,我如何强制它们采用我的数据库 ID?
Loading markers from the database causes their IDs to be reset each time, how can I force them to take on my database IDs?
我的数据库和在地图中加载标记时遇到问题 activity。现在,我有一个包含 MapsMarkers 的数据库(我自己的 class 标记)和一个名为 "marker_string_id" 的列,其中包含 Google 标记的 ID,生成如下:m0, m1、m2 等。我用它来删除我的 MapsMarkers,因为我通过 Google 标记 id (marker_string_id) 删除。在用户决定创建更多标记并删除更多标记之前,这非常有效。每次重新加载应用程序时,Google 标记的 ID 都会重置,但 MapsMarker marker_string_id 不会。前任。您有 3 个标记,ID 为 m0、m1、m2。删除一个并重新加载应用程序,现在您有 2 个 ID 为 m0、m1 的标记,但它们在数据库中的 ID 为 m1、m2。删除它们不再有效。我怎样才能使标记加载正确的 ID?
这是我在地图 activity 中加载标记的方法:
/**
* Method that adds the actual Google marker to the map in loadmarkers
* @param lat
*/
private void loadMarkersAdd(LatLng lat) {
Marker uMarker = Map.addMarker(new MarkerOptions()
.icon(BitmapDescriptorFactory
.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)) //Blue marker
.position(lat) //Places marker at hold area
.snippet(description));
String acc = uMarker.getId();
Log.i(LOGTAG, "New marker ID is " + acc);
}
/**
* Method for loading the markers onto the map in onResume, onCreate
*/
private void loadMarkers() {
try {
databaseHelper.open();
} catch (Exception e) {
Log.i(LOGTAG, "Loadmarkers DBOpen failed");
}
List<MapsMarker> markersList = databaseHelper.getAllMarkers();
for(int i = 0; i < markersList.size(); i ++) {
LatLng lat = new LatLng(markersList.get(i).getLat(), markersList.get(i).getLon());
String userMarkerIds = markersList.get(i).getId();
if (userMarkerLatLng.contains(lat) || userMarkerIDs.contains(userMarkerIds)) {
Log.i(LOGTAG, "Breaking contains");
break;
} else {
Log.i(LOGTAG, "Adding google maps marker");
loadMarkersAdd(lat); //Loads google maps markers if the marker isnt already there, prevents multiple google markers from being added
}
Log.i(LOGTAG, "LoadMarks looping");
}
}
我从数据库中获取所有标记的方法(加载标记时使用):
/**
* Returns a list of all markers currently in the database
*
* @return
*/
public List<MapsMarker> getAllMarkers() { //Cursor is basically the "pointer" where the database is looking at on the table at a given moment
List<MapsMarker> markers = new ArrayList<>();
try {
open();
} catch (Exception e) {
Log.i(LOGTAG, "Database opening failed");
}
Cursor cursor = db.query(TABLE_LOCATION, allMarkerColumns,
null, null, null, null, null);
cursor.moveToFirst();
Log.i(LOGTAG, "Returned " + cursor.getCount() + " marker table rows");
if (cursor.getCount() > 0) {
Log.i(LOGTAG, "GetAllMarkers if statement was run");
while (!cursor.isAfterLast()) { //while successfully moves to new row in table, return true
Log.i(LOGTAG, "While loop running");
MapsMarker marker = new MapsMarker(null, null, null);
marker.setId(cursor.getString(cursor.getColumnIndex(COLUMN_MARKER_ID)));
marker.setLat(cursor.getDouble(cursor.getColumnIndex(COLUMN_LAT)));
marker.setLon(cursor.getDouble(cursor.getColumnIndex(COLUMN_LONGITUDE)));
markers.add(marker);
cursor.moveToNext();
}
}
Log.i(LOGTAG, "Closing getAllMarkers cursor");
cursor.close(); //frees up cursor
close();
return markers;
}
最后,我的保存和删除方法:
/**
* Method for adding a marker to the database and returning its ID if needed (for deletion, find, etc.)
* @return
*/
public void saveMapsMarker(MapsMarker marker) {
open();
ContentValues values = new ContentValues(); //Dont .put COLUMN_MARKER_ID because it is autoincrementing
values.put(COLUMN_MARKER_STRING_ID, marker.getId());
values.put(COLUMN_LAT, marker.getLat());
values.put(COLUMN_LONGITUDE, marker.getLon());
db.insert(TABLE_LOCATION, null, values);
close();
}
/**
* Method for deleting marker by ID
*
* @param id
*/
public void deleteMapsMarker(String id) {
open();
db.delete(TABLE_LOCATION,
COLUMN_MARKER_STRING_ID + "=?", new String[]{String.valueOf(id)});
close();
}
编辑:
这是我添加的新方法。它有点管用,但我又遇到了同样的问题。现在,当我向地图添加一个新标记以根据数据库中标记的 ID 检查其 ID 时,新标记的 ID 也会被重置。
private void loadMarkers() {
try {
MyApplication.getDBHelper().open();
} catch (Exception e) {
Log.i(LOGTAG, "Loadmarkers DBOpen failed");
}
MapsMarker mapsMarker = new MapsMarker();
List<MapsMarker> markersList = mapsMarker.getAllMarkers();
for(int i = 0; i < markersList.size(); i ++) {
LatLng lat = new LatLng(markersList.get(i).getLat(), markersList.get(i).getLon());
Marker IdMarker = Map.addMarker(new MarkerOptions().position(lat)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.building_icon)));
MapsMarker replaceMapsMarker = new MapsMarker(); //Create new placeholder mapsMarker to check against database ID
replaceMapsMarker.setId(IdMarker.getId());
replaceMapsMarker.setLat(IdMarker.getPosition().latitude);
replaceMapsMarker.setLon(IdMarker.getPosition().longitude);
if(replaceMapsMarker.getLat() == markersList.get(i).getLat() && replaceMapsMarker.getLon() == markersList.get(i).getLon()) {
//Query database and update marker_string_id
String mId = replaceMapsMarker.getId(); //Pull new marker string ID
MyApplication.getDBHelper().updateMarkerId(markersList.get(i), mId); //Set database MapsMarker to new marker String ID???
} else { //If marker isnt in database, remove replacement and google maps markers
IdMarker.remove();
replaceMapsMarker.delete();
}
}
}
还有我的更新方法
/**
* Update Marker ID
*/
public void updateMarkerId(MapsMarker marker, String id) {
open();
ContentValues values = new ContentValues();
String markerId = marker.getId();
values.put(COLUMN_MARKER_STRING_ID, id);
db.update(TABLE_LOCATION, values, COLUMN_MARKER_STRING_ID + "=" + markerId, null);
close();
}
这是一个建议。如果您不需要经常重新加载地图,并且您的标记数量有限(比如少于 500 个左右),您可以通过对所有标记执行一个简单的 forloop 来简单地更新您的“marker_string_id
”每当您检测到重新加载时。
这是想法和 sudo 代码:
在重新加载地图时:
for(marker m: all_existing_markers){
//search in database by matching lat/lng
if(m.lat==database_marker.lat&&m.lng==database_marker.lng){
update database_marker.marker_string_id;
}
}
请注意,这只是一个 sudo 代码,因此您必须对数据库中的每个标记进行查询。希望这能给你一些想法。
我的数据库和在地图中加载标记时遇到问题 activity。现在,我有一个包含 MapsMarkers 的数据库(我自己的 class 标记)和一个名为 "marker_string_id" 的列,其中包含 Google 标记的 ID,生成如下:m0, m1、m2 等。我用它来删除我的 MapsMarkers,因为我通过 Google 标记 id (marker_string_id) 删除。在用户决定创建更多标记并删除更多标记之前,这非常有效。每次重新加载应用程序时,Google 标记的 ID 都会重置,但 MapsMarker marker_string_id 不会。前任。您有 3 个标记,ID 为 m0、m1、m2。删除一个并重新加载应用程序,现在您有 2 个 ID 为 m0、m1 的标记,但它们在数据库中的 ID 为 m1、m2。删除它们不再有效。我怎样才能使标记加载正确的 ID?
这是我在地图 activity 中加载标记的方法:
/**
* Method that adds the actual Google marker to the map in loadmarkers
* @param lat
*/
private void loadMarkersAdd(LatLng lat) {
Marker uMarker = Map.addMarker(new MarkerOptions()
.icon(BitmapDescriptorFactory
.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)) //Blue marker
.position(lat) //Places marker at hold area
.snippet(description));
String acc = uMarker.getId();
Log.i(LOGTAG, "New marker ID is " + acc);
}
/**
* Method for loading the markers onto the map in onResume, onCreate
*/
private void loadMarkers() {
try {
databaseHelper.open();
} catch (Exception e) {
Log.i(LOGTAG, "Loadmarkers DBOpen failed");
}
List<MapsMarker> markersList = databaseHelper.getAllMarkers();
for(int i = 0; i < markersList.size(); i ++) {
LatLng lat = new LatLng(markersList.get(i).getLat(), markersList.get(i).getLon());
String userMarkerIds = markersList.get(i).getId();
if (userMarkerLatLng.contains(lat) || userMarkerIDs.contains(userMarkerIds)) {
Log.i(LOGTAG, "Breaking contains");
break;
} else {
Log.i(LOGTAG, "Adding google maps marker");
loadMarkersAdd(lat); //Loads google maps markers if the marker isnt already there, prevents multiple google markers from being added
}
Log.i(LOGTAG, "LoadMarks looping");
}
}
我从数据库中获取所有标记的方法(加载标记时使用):
/**
* Returns a list of all markers currently in the database
*
* @return
*/
public List<MapsMarker> getAllMarkers() { //Cursor is basically the "pointer" where the database is looking at on the table at a given moment
List<MapsMarker> markers = new ArrayList<>();
try {
open();
} catch (Exception e) {
Log.i(LOGTAG, "Database opening failed");
}
Cursor cursor = db.query(TABLE_LOCATION, allMarkerColumns,
null, null, null, null, null);
cursor.moveToFirst();
Log.i(LOGTAG, "Returned " + cursor.getCount() + " marker table rows");
if (cursor.getCount() > 0) {
Log.i(LOGTAG, "GetAllMarkers if statement was run");
while (!cursor.isAfterLast()) { //while successfully moves to new row in table, return true
Log.i(LOGTAG, "While loop running");
MapsMarker marker = new MapsMarker(null, null, null);
marker.setId(cursor.getString(cursor.getColumnIndex(COLUMN_MARKER_ID)));
marker.setLat(cursor.getDouble(cursor.getColumnIndex(COLUMN_LAT)));
marker.setLon(cursor.getDouble(cursor.getColumnIndex(COLUMN_LONGITUDE)));
markers.add(marker);
cursor.moveToNext();
}
}
Log.i(LOGTAG, "Closing getAllMarkers cursor");
cursor.close(); //frees up cursor
close();
return markers;
}
最后,我的保存和删除方法:
/**
* Method for adding a marker to the database and returning its ID if needed (for deletion, find, etc.)
* @return
*/
public void saveMapsMarker(MapsMarker marker) {
open();
ContentValues values = new ContentValues(); //Dont .put COLUMN_MARKER_ID because it is autoincrementing
values.put(COLUMN_MARKER_STRING_ID, marker.getId());
values.put(COLUMN_LAT, marker.getLat());
values.put(COLUMN_LONGITUDE, marker.getLon());
db.insert(TABLE_LOCATION, null, values);
close();
}
/**
* Method for deleting marker by ID
*
* @param id
*/
public void deleteMapsMarker(String id) {
open();
db.delete(TABLE_LOCATION,
COLUMN_MARKER_STRING_ID + "=?", new String[]{String.valueOf(id)});
close();
}
编辑: 这是我添加的新方法。它有点管用,但我又遇到了同样的问题。现在,当我向地图添加一个新标记以根据数据库中标记的 ID 检查其 ID 时,新标记的 ID 也会被重置。
private void loadMarkers() {
try {
MyApplication.getDBHelper().open();
} catch (Exception e) {
Log.i(LOGTAG, "Loadmarkers DBOpen failed");
}
MapsMarker mapsMarker = new MapsMarker();
List<MapsMarker> markersList = mapsMarker.getAllMarkers();
for(int i = 0; i < markersList.size(); i ++) {
LatLng lat = new LatLng(markersList.get(i).getLat(), markersList.get(i).getLon());
Marker IdMarker = Map.addMarker(new MarkerOptions().position(lat)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.building_icon)));
MapsMarker replaceMapsMarker = new MapsMarker(); //Create new placeholder mapsMarker to check against database ID
replaceMapsMarker.setId(IdMarker.getId());
replaceMapsMarker.setLat(IdMarker.getPosition().latitude);
replaceMapsMarker.setLon(IdMarker.getPosition().longitude);
if(replaceMapsMarker.getLat() == markersList.get(i).getLat() && replaceMapsMarker.getLon() == markersList.get(i).getLon()) {
//Query database and update marker_string_id
String mId = replaceMapsMarker.getId(); //Pull new marker string ID
MyApplication.getDBHelper().updateMarkerId(markersList.get(i), mId); //Set database MapsMarker to new marker String ID???
} else { //If marker isnt in database, remove replacement and google maps markers
IdMarker.remove();
replaceMapsMarker.delete();
}
}
}
还有我的更新方法
/**
* Update Marker ID
*/
public void updateMarkerId(MapsMarker marker, String id) {
open();
ContentValues values = new ContentValues();
String markerId = marker.getId();
values.put(COLUMN_MARKER_STRING_ID, id);
db.update(TABLE_LOCATION, values, COLUMN_MARKER_STRING_ID + "=" + markerId, null);
close();
}
这是一个建议。如果您不需要经常重新加载地图,并且您的标记数量有限(比如少于 500 个左右),您可以通过对所有标记执行一个简单的 forloop 来简单地更新您的“marker_string_id
”每当您检测到重新加载时。
这是想法和 sudo 代码:
在重新加载地图时:
for(marker m: all_existing_markers){
//search in database by matching lat/lng
if(m.lat==database_marker.lat&&m.lng==database_marker.lng){
update database_marker.marker_string_id;
}
}
请注意,这只是一个 sudo 代码,因此您必须对数据库中的每个标记进行查询。希望这能给你一些想法。