मैं अपने मानचित्र पर एकाधिक मार्कर सम्मिलित करने में सक्षम हूं। लेकिन जब मैं अपने फ़ायरबेस डेटाबेस में सम्मिलित कर रहा हूं, तो यह केवल आखिरी मार्कर है जो डाला जाता है। मैं सोच रहा हूं कि मुझे किसी प्रकार की सूची या हैशपैप का उपयोग करना है।

पीओजेओ वर्ग:

public class FirebaseMarker {

  String address;
  String time;
  double latitude;
  double longitude;
  String routeId;

  public FirebaseMarker() {
  }

  public FirebaseMarker(String address, String time, double latitude, double longitude, String routerId) {
      this.address = address;
      this.time = time;
      this.latitude = latitude;
      this.longitude = longitude;
      this.routeId = routerId;
  }

  public String getRouterId() {
    return routeId;
  }

  public void setRouterId(String routerId) {
    this.routeId = routerId;
  }

  public String getAddress() {
    return address;
  }

  public void setAddress(String address) {
    this.address = address;
  }

  public String getTime() {
    return time;
  }

  public void setTime(String time) {
    this.time = time;
  }

  public double getLatitude() {
    return latitude;
  }

  public void setLatitude(double latitude) {
    this.latitude = latitude;
  }

  public double getLongitude() {
    return longitude;
  }

  public void setLongitude(double longitude) {
    this.longitude = longitude;
  }
}

मार्कर निर्माण:

List<Marker> markers;
markers = new ArrayList<>();

Marker marker =  mMap.addMarker(new MarkerOptions()
                 .position(latLng)
                 .title(address)
                 .snppet(time)
                 .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));

 markers.add(marker);

मैं कैसे सम्मिलित कर रहा हूँ:

//FirebaseMarker marker = new FirebaseMarker(address, time, latitude, longitude, routeId); 

 markerId = userRef.push().getKey();
userRef.child(sharedPreferences.getString("school",null)).child("markers").child(markerId).setValue(markers);

पैरामीटर उपयोगकर्ता इनपुट और भू-कोडर दोनों से हैं

enter image description here

0
JDoe 31 अक्टूबर 2017, 19:08

3 जवाब

सबसे बढ़िया उत्तर

ऐसा लगता है कि आपके पास मार्कर को डेटाबेस में सहेजने का सामान्य आधार है, लेकिन बाद में डेटाबेस में सहेजने में सक्षम होने के लिए आपको पहले प्रत्येक मार्कर को स्मृति में संग्रहीत करना होगा।

इसके लिए, आप बचत को आसान बनाने के लिए HashMap का उपयोग कर सकते हैं:

HashMap<String, Object> markers = new HashMap<>();

public void createMarker(String routeId, LatLng latLng, String address, String time) {    
    // Create a unique ID for this marker (but don't actually store it yet)
    String markerId = schoolReference.child("markers").push().getKey();

    // Add the marker to the HashMap
    FirebaseMarker marker = new FirebaseMarker(address, time, latLng.getLatitude(), latLng.getLongitude(), routeId);
    markers.put(markerId, marker);

    // Add an actual map marker to the map
    mMap.addMarker(new MarkerOptions()
        .position(latLng)
        .title(address)
        .snppet(time)
        .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED))
    );
}

इस उदाहरण में, जब आप मार्कर (createMarker() विधि में) बनाते हैं, तो आप मानचित्र में वास्तव में मार्कर जोड़ने से पहले 3 अतिरिक्त क्रियाएं करते हैं:

  • push() (यह डेटाबेस से संपर्क नहीं करता है) का उपयोग करके इस मार्कर के लिए एक अद्वितीय आईडी जेनरेट करें।
  • एक FirebaseMarker इंस्टेंस बनाएं जिसे बाद में इस्तेमाल किया जा सके
  • इस अद्वितीय आईडी और FirebaseMarker जोड़ी को एक HashMap में जोड़ें

फिर, जब आप इन्हें डेटाबेस में सहेजना चाहते हैं, तो आप केवल updateChildren() का उपयोग करके बहु-स्थान अपडेट करना:

public void saveToDatabase() {
    // Do your thing to save the route

    // Save the markers to the database in one write operation
    schoolReference.child("markers").updateChildren(markers);
}
1
Grimthorr 1 नवम्बर 2017, 14:48

इसे हल करने के लिए, आपके पास प्रत्येक प्रविष्टि के लिए एक विशिष्ट पहचानकर्ता होना चाहिए। चूंकि फायरबेस डेटाबेस एक नोएसक्यूएल डेटाबेस है और कुंजी और मूल्यों के जोड़े के रूप में संरचित है, प्रत्येक नोड एक Map है, जिसका अर्थ है कि Map के मामले में, यह पुराने मान को नए के साथ बदल देता है। तो, आपको कोड की इस पंक्ति को बदलने की जरूरत है:

userRef.child(sharedPreferences.getString("school",null)).child("markers").child(markerId).setValue(marker);

साथ

userRef.push().child(sharedPreferences.getString("school",null)).child("markers").child(markerId).setValue(marker);

जैसा कि आप शायद देख रहे हैं, मैंने आपके userRef के ठीक बाद push() विधि जोड़ दी है। यदि आपको उस पुश की को किसी अन्य स्थान पर रखना है, तो बस उस विधि को सही स्थिति में ले जाएं।

संपादित करें: अपने Firebase डेटाबेस में एक नोड को अपडेट करने के लिए आपको setValue() के बजाय updateChildren() विधि का उपयोग करना होगा:

markerId = userRef.push().getKey();
Map<String, Object> map = new HashMap<>();
map.put(markerId, marker);
userRef.child(sharedPreferences.getString("school",null)).child("markers").updateChildren(map);
1
Alex Mamo 31 अक्टूबर 2017, 19:39
FirebaseMarker marker = new FirebaseMarker(address, time, latitude, 
longitude, routeId); 

DatabaseReference userRef=FirebaseDatabase.getInstance().getReference().child("sharedPreferences.getString("school",null)").child("markers").push().setValue(marker);
1
Peter Haddad 31 अक्टूबर 2017, 21:50