2017-10-31 9 views
0

マップに複数のマーカーを挿入できます。しかし、私がFirebaseデータベースに挿入するとき、挿入されるのは最後のマーカだけです。私はリストやハッシュマップのいくつかを使用しなければならないと思っています。Android - push()を使用して複数のマーカーを挿入する

POJOクラス:

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

マップにマーカーを追加するコードを共有できますか?私は、このマーカーを 'List'または' HashMap'に追加する必要があると思います。そして、そのボタンが押されたときにそのリストをデータベースに保存する必要があります。 – Grimthorr

+0

投稿を編集しました。私はマーカを追加するリストを持っており、データベースにリストを挿入します。これは効果がありますか? – JDoe

答えて

1

あなたが保存の一般的な前提を持っているように見えますマーカーを正確にデータベースに保存しますが、各マーカーを後でデータベースに保存するには、まずそれらのマーカーをメモリーに保存する必要があります。このため

、あなたは貯蓄簡素化するためにHashMapを使用することができます:あなたは(createMarker()方法で)マーカーを作成するときに、あなたが実際にマーカーを追加する前に、3つの追加のアクションを実行し、この例では

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

をマップ:

  • push()を使用して、このマーカーのためのユニークなIDを生成します(これはデータベースに連絡しません)
  • FirebaseMarkerインを作成します。あなたは、データベースにこれらを保存したい場合、あなたは、単にperforming a multi-location update using updateChildren()して、データベース上にHashMap全体を押し、次にHashMap

に、このユニークなIDとFirebaseMarkerペアを追加し、後で

  • 使用することができタンス:

    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); 
    } 
    
  • +0

    これは、@AlexMamoが投稿した修正された回答に似ていることに気付きました。 – Grimthorr

    +0

    私はこれをやろうとします。 – JDoe

    +0

    簡単な質問:schoolReferenceを書くときは、databaseReferenceやsharedPreferences内に保存した実際の学校変数として意味しますか? – JDoe

    1

    これを解決するには、挿入するたびに固有の識別子が必要です。 FirebaseデータベースはNoSQLデータベースであり、キーと値のペアとして構成されているため、すべてのノードは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); 
    

    と私は右のあなたの userRefpush()メソッドが追加されました。プッシュしたキーを別の場所に置く必要がある場合は、そのメソッドを正しい位置に移動するだけです。

    編集:あなたはこのようなsetValue()の代わりにupdateChildren()メソッドを使用する必要があなたのFirebaseデータベース内のノードを更新するには:

    markerId = userRef.push().getKey(); 
    Map<String, Object> map = new HashMap<>(); 
    map.put(markerId, marker); 
    userRef.child(sharedPreferences.getString("school",null)).child("markers").updateChildren(map); 
    
    +0

    これは私がそれを望んでいた方法ではありません。 markerId子はpush()です。私は自分のコードを編集しました。問題は、マップにマーカーが3つある場合です。保存ボタンを押すと、最後のマーカーだけが保存されます。 – JDoe

    +0

    'markerId'子はあなたのコードの前にありませんでした。だから私の更新答えをご覧ください。 –

    +0

    私はupdateChildrenをしたくありません。マップに3つのマーカーがある場合、push()を使って3つの新しいノードを挿入します。 – JDoe

    1
    FirebaseMarker marker = new FirebaseMarker(address, time, latitude, 
    longitude, routeId); 
    
    DatabaseReference userRef=FirebaseDatabase.getInstance().getReference().child("sharedPreferences.getString("school",null)").child("markers").push().setValue(marker); 
    
    +0

    これは、学校ノードの内部ではなく、ルートに1つのノードを追加します。しかし、まだノードが1つしか追加されていません。 – JDoe

    +0

    @JDoeチェックが動作するかどうか、私は –

    +0

    を更新しました。それは動作しません。自分の投稿を自分のデータベースの画像で編集しました。 push()idは1つだけ追加されます。 – JDoe

    関連する問題