Android 保存地图标记

Android 保存地图标记,android,sqlite,google-maps,Android,Sqlite,Google Maps,我的任务是制作一个地图应用程序,在长时间单击时放置标记,并在标记单击时显示标记信息。我还必须将其保存到SQLite中。问题是我陷入困境,似乎有什么不对劲。SQLite在离开应用程序后显示为空。我不知道如何拯救他们。欢迎任何帮助。 targer处于应用程序退出状态,标记将保存在DB中,再次启动时将重新加载并显示在地图上。 以下是我目前的代码: 主要活动: private GoogleMap mMap; private JSONObject httpResponse; private String

我的任务是制作一个地图应用程序,在长时间单击时放置标记,并在标记单击时显示标记信息。我还必须将其保存到SQLite中。问题是我陷入困境,似乎有什么不对劲。SQLite在离开应用程序后显示为空。我不知道如何拯救他们。欢迎任何帮助。 targer处于应用程序退出状态,标记将保存在DB中,再次启动时将重新加载并显示在地图上。 以下是我目前的代码: 主要活动:

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();
}