Android 保存地图标记
我的任务是制作一个地图应用程序,在长时间单击时放置标记,并在标记单击时显示标记信息。我还必须将其保存到SQLite中。问题是我陷入困境,似乎有什么不对劲。SQLite在离开应用程序后显示为空。我不知道如何拯救他们。欢迎任何帮助。 targer处于应用程序退出状态,标记将保存在DB中,再次启动时将重新加载并显示在地图上。 以下是我目前的代码: 主要活动:Android 保存地图标记,android,sqlite,google-maps,Android,Sqlite,Google Maps,我的任务是制作一个地图应用程序,在长时间单击时放置标记,并在标记单击时显示标记信息。我还必须将其保存到SQLite中。问题是我陷入困境,似乎有什么不对劲。SQLite在离开应用程序后显示为空。我不知道如何拯救他们。欢迎任何帮助。 targer处于应用程序退出状态,标记将保存在DB中,再次启动时将重新加载并显示在地图上。 以下是我目前的代码: 主要活动: private GoogleMap mMap; private JSONObject httpResponse; private String
private GoogleMap mMap;
private JSONObject httpResponse;
private String markerCountry;
private String markerStreetAddress;
private JSONArray addressArray;
private ArrayList<Markers> markerOptionsList;
private Markers markerForDb;
private LatLng markerPosition;
private int counter=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
protected void onDestroy() {
if (counter==0){
DatabaseHandler db = new DatabaseHandler(getApplicationContext(),null,null,1);
try{
for (Markers marker : markerOptionsList) {
db.addMarker(marker);
}
}catch (NullPointerException e){
e.printStackTrace();
}finally {
db.close();
}
}
super.onDestroy();
}
@Override
protected void onPause() {
if (counter==0){
DatabaseHandler db = new DatabaseHandler(getApplicationContext(),null,null,1);
try{
for (Markers marker : markerOptionsList) {
db.addMarker(marker);
}
}catch (NullPointerException e){
e.printStackTrace();
}finally {
db.close();
}
}
super.onPause();
}
@Override
protected void onStop() {
if (counter==0){
DatabaseHandler db = new DatabaseHandler(getApplicationContext(),null,null,1);
try{
for (Markers marker : markerOptionsList) {
db.addMarker(marker);
}
}catch (NullPointerException e){
e.printStackTrace();
}finally {
db.close();
}
}
super.onStop();
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
mMap.setMyLocationEnabled(true);
mMap.setOnMapLongClickListener(this);
mMap.setOnMarkerClickListener(this);
markerOptionsList = new ArrayList<>();
}
@Override
public void onMapLongClick(LatLng latLng) {
markerPosition = latLng;
mMap.addMarker(new MarkerOptions().position(markerPosition));
getAddress(latLng);
AsyncSaveToDb async2 = new AsyncSaveToDb();
async2.execute(latLng);
}
private void getAddress(LatLng latLng) {
URL url = null;
try {
url = new URL("https://maps.googleapis.com/maps/api/geocode/json?latlng=" + latLng.latitude + "," + latLng.longitude + "&key=AIzaSyBWH6gioY47pZjtCy-lz3rmyYNKVBOZnaA");
} catch (MalformedURLException e) {
e.printStackTrace();
}
Async async = new Async();
async.execute(url);
}
@Override
public boolean onMarkerClick(Marker marker) {
for (Markers markers :markerOptionsList) {
double lat = markers.get_lat();
double lng = markers.get_lng();
LatLng latlng = new LatLng(lat,lng);
if (latlng.equals(marker.getPosition())){
Intent intent = new Intent(getApplicationContext(),com.example.fixxxer.mapclicker.MarkerInfoPage.class);
String addressForText = markers.get_address();
String countryForText = markers.get_country();
String locationForText = markers.get_lat() + ", " + markers.get_lng();
intent.putExtra("address", addressForText);
intent.putExtra("country", countryForText);
intent.putExtra("location", locationForText);
startActivity(intent);
}
}
return true;
}
public class Async extends AsyncTask<URL, Void, JSONArray> {
@Override
protected JSONArray doInBackground(URL... params) {
BufferedReader reader;
InputStream inputStream;
JSONArray results = null;
try {
StringBuilder responseBuilder = new StringBuilder();
HttpURLConnection conn = (HttpURLConnection) params[0].openConnection();
conn.setReadTimeout(10000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.connect();
inputStream = conn.getInputStream();
reader = new BufferedReader(new InputStreamReader(inputStream));
for (String line; (line = reader.readLine()) != null; ) {
responseBuilder.append(line).append("\n");
}
httpResponse = new JSONObject(responseBuilder.toString());
results = httpResponse.getJSONArray("results");
inputStream.close();
reader.close();
} catch (IOException | JSONException e) {
e.printStackTrace();
}
return results;
}
@Override
protected void onPostExecute(JSONArray resultList) {
addressArray = resultList;
JSONArray responseComponents;
try {
if (addressArray != null) {
JSONObject firstResult = addressArray.getJSONObject(0);
if (firstResult != null) {
responseComponents = firstResult.getJSONArray("address_components");
if (responseComponents != null) {
for (int i = 0; i < responseComponents.length(); i++) {
JSONObject currentComponent = responseComponents.getJSONObject(i);
if (currentComponent.getString("types").contains("country")) {
markerCountry = currentComponent.getString("long_name");
markerStreetAddress = firstResult.getString("formatted_address");
if (markerStreetAddress==null||markerStreetAddress.isEmpty()){
markerStreetAddress="No address available for this location";
}else{
String[] split = markerStreetAddress.split(",");
markerStreetAddress="";
for (int j =0;j<split.length-1;j++){
markerStreetAddress+=split[j];
}
}
}
}
}
}
}
} catch (JSONException e) {
e.printStackTrace();
}
if (markerStreetAddress==null||markerStreetAddress.isEmpty()) {
markerStreetAddress = "No address available for this location";
}
Toast.makeText(getApplicationContext(), "Marker added", Toast.LENGTH_SHORT).show();
}
}
public class AsyncSaveToDb extends AsyncTask<LatLng, Void, Markers>{
@Override
protected Markers doInBackground(LatLng... params) {
markerForDb = new Markers();
markerForDb.set_address(markerStreetAddress);
markerForDb.set_country(markerCountry);
markerForDb.set_lat(params[0].latitude);
markerForDb.set_lng(params[0].longitude);
markerForDb.set_image("image");
return markerForDb;
}
@Override
protected void onPostExecute(Markers markers) {
markers = markerForDb;
markerOptionsList.add(markerForDb);
super.onPostExecute(markers);
}
}
最后是MarkersInfo页面:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_marker_info_page);
TextView addressText = (TextView) findViewById(R.id.addressView);
TextView countryText = (TextView) findViewById(R.id.countryView);
TextView position = (TextView) findViewById(R.id.latlngText);
String address = getIntent().getStringExtra("address");
String country =getIntent().getStringExtra("country");
String location =getIntent().getStringExtra("location");
addressText.setText(address);
countryText.setText(country);
position.setText(location);
Button backButton = (Button) findViewById(R.id.backButton);
backButton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
super.finish();
}
我被困在这里很长时间了。任何帮助都是无价的。db.insert(TABLE_LOCATIONS,null,values)在“db”类中返回什么?什么都没有……什么都没有?方法不是无效的!公共长插入(String table,String nullColumnHack,ContentValues),java.lang.String,android.content.ContentValues),正如您所看到的,insert返回一个long,即插入行的行id。如果为-1,则没有插入行插入正在工作。我得到行结果。当映射准备就绪(您有回调)时,您应该从数据库中获取项目,然后通过添加标记从这些项目填充映射。但这与android studio无关,只是编码;)db.insert(TABLE_LOCATIONS,null,values)在“db”类中返回什么?什么都没有…什么都没有?方法不是无效的!公共长插入(String table,String nullColumnHack,ContentValues),java.lang.String,android.content.ContentValues),正如您所看到的,insert返回一个long,即插入行的行id。如果为-1,则没有插入行插入正在工作。我得到行结果。当映射准备就绪(您有回调)时,您应该从数据库中获取项目,然后通过添加标记从这些项目填充映射。但这与android studio无关,只是编码;)
private int _id;
private String _address;
private String _country;
private double _lat;
private double _lng;
private String _image;
public Markers(int _id, String _address, String _country, double _lat, double _lng, String _image) {
this._id = _id;
this._address = _address;
this._country = _country;
this._lat = _lat;
this._lng = _lng;
this._image = _image;
}
public Markers(String _address, String _country, double _lat, double _lng, String _image) {
this._address = _address;
this._country = _country;
this._lat = _lat;
this._lng = _lng;
this._image = _image;
}
public Markers() {
}
public int get_id() {
return _id;
}
public void set_id(int _id) {
this._id = _id;
}
public String get_address() {
return _address;
}
public void set_address(String _address) {
this._address = _address;
}
public String get_country() {
return _country;
}
public void set_country(String _country) {
this._country = _country;
}
public double get_lat() {
return _lat;
}
public void set_lat(double _lat) {
this._lat = _lat;
}
public double get_lng() {
return _lng;
}
public void set_lng(double _lng) {
this._lng = _lng;
}
public String get_image() {
return _image;
}
public void set_image(String _image) {
this._image = _image;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_marker_info_page);
TextView addressText = (TextView) findViewById(R.id.addressView);
TextView countryText = (TextView) findViewById(R.id.countryView);
TextView position = (TextView) findViewById(R.id.latlngText);
String address = getIntent().getStringExtra("address");
String country =getIntent().getStringExtra("country");
String location =getIntent().getStringExtra("location");
addressText.setText(address);
countryText.setText(country);
position.setText(location);
Button backButton = (Button) findViewById(R.id.backButton);
backButton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
super.finish();
}