这是Google地图应用。 onLongClick()
标记添加到两个列表中。一个只有LatLng
用于将来保存sharedPrefferences
,而另一个用于onDestroy()
中的SQLite。问题是,当我将它放在地图上时,我从数据库中返回的LatLng
比标记中的更短。这使我的信息活动无法打开。
这是我的方法:
@Override
public void onMapLongClick(LatLng latLng) {
MarkerOptions markerOptions = new MarkerOptions().position(latLng);
mMap.addMarker(markerOptions);
markerOptions=getAddress(markerOptions);
locations.add(latLng.latitude + ", " + latLng.longitude);
databaseList.add(markerOptions);
}
从这里markerOptions
对象转到List<MarkerOptions> databaseList
在onDestroy()
中,列表转到DB:
public void insertList(List<MarkerOptions> list) {
SQLiteDatabase db = getWritableDatabase();
db.execSQL("DELETE FROM " + TABLE_LOCATIONS);
for (MarkerOptions marker : list) {
ContentValues values = new ContentValues();
String[] split = marker.getTitle().split(", ");
values.put(COLUMN_ADDRESS, split[0]);
values.put(COLUMN_COUNTRY, split[1]);
values.put(COLUMN_LAT, marker.getPosition().latitude);
values.put(COLUMN_LNG, marker.getPosition().longitude);
db.insertWithOnConflict(TABLE_LOCATIONS, null, values, SQLiteDatabase.CONFLICT_REPLACE);
values.clear();
}
db.close();
}
然后在onCreate()
中,我使用markerOptions
填充相同的列表:
public class DatabaseProcessThread extends AsyncTask<List<MarkerOptions>,Void,List<MarkerOptions>>{
@Override
protected List<MarkerOptions> doInBackground(List<MarkerOptions>... params) {
SQLiteHelper db = new SQLiteHelper(getApplicationContext(),null,null,1);
return db.getExistingMarkers();
}
@Override
protected void onPostExecute(List<MarkerOptions> markerOptionses) {
super.onPostExecute(markerOptionses);
databaseList=markerOptionses;
}
}
问题是当我用4个标记测试它时,重新启动应用程序并在地图上再放一个,旧的4没有打开因为它们没有通过if
:
@Override
public boolean onMarkerClick(Marker marker) {
for (MarkerOptions options : databaseList) {
if (options.getPosition().latitude==marker.getPosition().latitude&&options.getPosition().longitude==marker.getPosition().longitude){
Intent intent = new Intent(this,com.example.fixxxer.map.MarkerActivity.class);
Log.v(TAG,options.getPosition().toString());
String[]split = options.getTitle().split(", ");
intent.putExtra("Address",split[0]);
intent.putExtra("Country",split[1]);
intent.putExtra("Latitude",marker.getPosition().latitude);
intent.putExtra("Longitude",marker.getPosition().longitude);
Toast.makeText(MapsActivity.this,split[0]+","+split[1], Toast.LENGTH_SHORT).show();
startActivity(intent);
}else{
Log.v(TAG,options.getPosition().toString());
}
}
return true;
}
这就是我获取markerOptions
:
public List<MarkerOptions> getExistingMarkers() {
ArrayList<MarkerOptions> list = new ArrayList<>();
String query = "SELECT * FROM " + TABLE_LOCATIONS;
Cursor curs = null;SQLiteDatabase db = null;
try {
db = getReadableDatabase();
curs = db.rawQuery(query, null);
curs.moveToFirst();
if (curs.isFirst()) {
do {
MarkerOptions markerOptions = new MarkerOptions();
markerOptions.title(curs.getString(1) + ", " + curs.getString(2));
LatLng latlng = new LatLng(Double.valueOf(curs.getString(3)), Double.valueOf(curs.getString(4)));
markerOptions.position(latlng);
list.add(markerOptions);
curs.moveToNext();
} while (!curs.isAfterLast());
}
} catch (NullPointerException e) {
e.printStackTrace();
}
curs.close();
db.close();
return list;
}
返回的所有5个位置 Log.v
:
01-14 13:21:17.859 7841-7841/com.example.fixxxer.map V/MAPS ACTIVITY: lat/lng: (-16.9619,20.079)
01-14 13:21:17.859 7841-7841/com.example.fixxxer.map V/MAPS ACTIVITY: lat/lng: (-25.4685,23.4743)
01-14 13:21:17.859 7841-7841/com.example.fixxxer.map V/MAPS ACTIVITY: lat/lng: (1.3249,12.0056)
01-14 13:21:17.859 7841-7841/com.example.fixxxer.map V/MAPS ACTIVITY: lat/lng: (-29.0083,24.7622)
01-14 13:21:17.859 7841-7841/com.example.fixxxer.map V/MAPS ACTIVITY: lat/lng: (-4.444019301843549,27.22086824476719)
我做错了什么?
答案 0 :(得分:0)
我猜你会在数据库列表和位置列表中保存不同的值:
markerOptions=getAddress(markerOptions);
可能known user
会导致数据库中的位置值与地图上的实际标记不同。