2017-06-11 5 views
0

firebaseデータベースからデータを取得する際にこの問題が発生しました。私は、以下のアンドロイドコードを使用してデータベースに以下の詳細をプッシュしました。FirebaseからLatログデータを取得し、マーカとしてマップに貼り付けます

   scanString = intent.getStringArrayListExtra("beaconList"); 
      nameList = intent.getStringArrayListExtra("nameList"); 
      addressList = intent.getStringArrayListExtra("addressList"); 
      RssiList = intent.getIntegerArrayListExtra("RssiList"); 

      for (int i=0; i < scanString.size(); i++) { 
       addBeacon.name = nameList.get(i); 
       addBeacon.address = addressList.get(i); 
       addBeacon.Rssi = RssiList.get(i); 
       addBeacon.latitude = mLastKnownLocation.getLatitude(); 
       addBeacon.longitude = mLastKnownLocation.getLongitude(); 
       databaseReference.child("foo").push().setValue(addBeacon); 

と次のような構造があります。

私はこの緯度&をデータベースから取得し、これらの座標を使ってマーカーにマーカーを配置したいと考えています。

私はそれに次のコードを使用しています。

scanString.add("11"); 
     databaseReference = FirebaseDatabase.getInstance().getReference().child("foo").child("-KltK9gp7g5h1YpqaCmW"); 

     //databaseReference.addValueEventListener(new ValueEventListener() { 
     //databaseReference.addChildEventListener(new ChildEventListener() { 

     ChildEventListener childEventListener = new ChildEventListener() { 


      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) { 
       Log.d("Child Event,longitude", dataSnapshot.getKey()); 
       addBeacon = dataSnapshot.getValue(beacon.class); 
       scanString.add("add beacon retrieved"); 
      } 
      @Override 
      public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) { 
       Log.d("Child Event,longitude","onChildChanged:"+ dataSnapshot.getKey()); 
       addBeacon = dataSnapshot.getValue(beacon.class); 
      } 
      @Override 
      public void onChildRemoved(DataSnapshot dataSnapshot) {    } 
      @Override 
      public void onChildMoved(DataSnapshot dataSnapshot, String s) {    } 
      @Override 
      public void onCancelled(DatabaseError databaseError) {} 
     }; 
     databaseReference.addChildEventListener(childEventListener); 
     databaseReference.push().setValue(scanString); 
    } 

誰かが助けることができれば、本当に素晴らしいことになります。前もって感謝します !!

+0

主な問題は、Firebaseデータベースとアプリケーション間の同期です。子供が追加されたときにリアルタイムで値を取得したいが、それは起こっていない。値は多くの遅延で更新されるため、地図上にマーカーをリアルタイムで配置することはできません。 –

答えて

0

地図上のマーカーを配置するには、あなたが最初のマップと(例えばGoogleMap mMapなど)の参照が必要になります

あなたはこのような基準を持っている場合は、あなたがする必要があるすべては緯度経度のインスタンスにあなたの座標を変換していますいいえ(サイドノートとして

、あなたがFirebaseからあなたのデータを取得する問題があり、一度だけ、あなたのデータを取得する場合:あなたは、マーカーhereに関する詳細な情報を得ることができ

LatLng coord = new LatLng(addBeacon.latitude, addBeacon.longitude); 
map.addMarker(new MarkerOptions() 
    .position(coord) 
    .title("Hello world")); 

:とマーカーを追加トンの変更が発生した場合、それは)ChildEventListenerが発生する変更を待って、何をするかである、あなたはListenerForSingleValueEventを使用することができます。

databaseReference.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      beacon addBeacon = dataSnapshot.getValue(beacon.class); 
      LatLng coord = new LatLng(addBeacon.latitude, addBeacon.longitude); 
      marker = map.addMarker(new MarkerOptions() 
       .position(coord) 
       .title("Hello world"));  
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
+0

ありがとうございます@merterpam私はそれに従うと私はいくつかのトラブルに直面しているかどうかをお知らせしようとします。 –

+0

あなたが説明したようにマーカーオプションを作成しましたが、パートを取得するためには "addBeacon"変数の使い方がわかりません。もう一つは、私のアイデアは、特定のUUIDでビーコンをスキャンし、私のGPS座標と一緒にfirebaseにアップロードすることです。同じUUIDを検出するたびに、新しい値を作成して更新したいと思います。特定のビーコン。ちょっと混乱します。 –

+0

私はそれを使ってマーカーを作成できると思っていましたが、あなたのロジックはもう少し複雑ですね。同じキー(プッシュではなく直接setValue)を追加すると、Firebaseはマップのように動作し、古い値を上書きします。あなたが言及した遅れについては、なぜそれが起こるのか正確にはわからないが、遅れはあまりにも過大であってはならない。 – merterpam

関連する問題