从数据库加载标记会导致它们的 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 代码,因此您必须对数据库中的每个标记进行查询。希望这能给你一些想法。