2017-11-21 17 views
-1

私はGoogle Maps MapViewを使用するアプリケーションを持っています。私のマップでは、Firebase Realtimeデータベースに保存するマーカーを挿入できます。私はプッシュキーやマーカーを置くHashMapを持って、私のフラグメントでAndroid - Firebaseが正しく挿入されない

public class FirebaseMarker { 
    String address; 
    String time; 
    double latitude; 
    double longitude; 
    ... 
} 

:私はFirebaseMarkerクラスを持っています。ボタンを押すと、これらのマーカーがデータベースに保存されます。

public class MapFragment extends Fragment implements OnMapReadyCallback { 
    HashMap<String, Object> markers = new HashMap<>(); 

    public void onMapReady(final GoogleMap googleMap) { 
     String markerIds = userRef.push().getKey(); 
     FirebaseMarker marker = new FirebaseMarker(address, time, latitude, longitude); 
     markers.put(markerIds, marker); 
    } 

    private void saveToDatabase(){ 
     userRef.child(sharedPreferences.getString("school", null)).child("markers").updateChildren(markers); 
    } 
} 

これは正常に動作しますが、私はまたFirebase内の異なるノード内のほんの一部のプロパティ(PartialMarker)と同じマーカーを追加したいです。これは、常にデータベースに欠けている部分マーカーが1つあるので、私に問題をもたらします。したがって、マップ上に3つのマーカーを置くと、ノード内のデータベースには2つの部分マーカーしか保存されません。その後

public class PartialMarker { 
    String address; 
    String time; 
    .. 
} 

を私が行います:私がやっていること

public class MapFragment extends Fragment implements OnMapReadyCallback { 
    HashMap<String, Object> partialMarkers= new HashMap<>(); 

    public void onMapReady(final GoogleMap googleMap) { 
     for (Map.Entry<String, Object> entry : markers.entrySet()) { 
      String key = entry.getKey(); 
      FirebaseMarker marker = (FirebaseMarker) entry.getValue(); 
      partialMarkers.put(key, new PartialMarker(marker.getAddress(), marker.getTime())); 
     } 
    } 

    private void saveToDatabase(){ 
     userRef.child(sharedPreferences.getString("school", null)).child("markers").updateChildren(markers);  
     userRef.child(sharedPreferences.getString("school", null)).child("routes").child(routeId).child("partialMarkers").updateChildren(partialMarkers); 
    } 
} 

マーカーノード:

enter image description here

部分マーカーノード:

enter image description here

+0

saveToDatabase()はいつ使用しますか?完全なコードを追加してください。 – MarcGV

+0

コードは問題なく表示されるため、他にも問題がある可能性があります。完全なコードサンプルを共有できますか? 'FirebaseMarker marker = new FirebaseMarker([...])'を実行するときにも、 'PartialMarker partialMarker = new PartialMarker([...])を実行すると同時に、両方のマーカーを同時に作成すると、 ) 'を作成し、それらを異なるマップに入れると、各リストには常に正しい数の項目が存在するはずです。 'PartialMarker'マップを' FirebaseMarker'マップと同期して作成していない可能性があります。 – Grimthorr

+0

@Grimthorrによると、部分マーカーマップの同期が外れている可能性が最も高いです。 'saveToDatabase()'にブレークポイントを置き、両方のマップの長さを数えます。もしそれらが本当に同じであれば、実行可能な小さな断片で問題を切り分けることができますか?そのため、テストするアプリにコピー/貼り付けできるハードコーディングされた値があります。 –

答えて

1

これは、最新のMarkerが追加される前にmarkersマップを反復処理する可能性が高いため、マップに同じ数の項目が含まれていません。

私は同時に両方のマーカーを作成することをお勧めしたい、何かのように:

String markerId = userRef.push().getKey(); 

FirebaseMarker marker = new FirebaseMarker(address, time, latitude, longitude); 
PartialMarker partialMarker = new PartialMarker(address, time) 

markers.put(markerId, marker); 
partialMarkers.put(markerId, partialMarker); 

この方法では、両方のマップが同じ数の項目を持っていることを保証しています。

+1

あなたの答えをありがとう。これは完全に機能します。私はあなたの答えを受け入れている:) – JDoe

関連する問題