当前位置: 首页 > 知识库问答 >
问题:

从google Firebase实时数据库读取google maps标记数据时遇到问题

公良凯
2023-03-14

我有一个Firebase实时数据库,在那里我存储谷歌地图标记数据。看起来是这样的:Firebase数据库

我的应用程序可以选择将您自己的标记添加到数据库中,我的问题是我的应用程序只从Studio 1和T1读取信息,而不是从. ush()添加的随机键中读取信息。当我通过应用程序添加标记时。关于如何让它读取随机键下的标记信息有什么想法吗?我的代码如下所示:

public class MapsActivity extends FragmentActivity implements 
OnMapReadyCallback, GoogleMap.OnMarkerClickListener {

FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
DatabaseReference mProfileRef = firebaseDatabase.getReference("Studios");
ChildEventListener mChildEventListener;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maps);
    // Obtain the SupportMapFragment and get notified when the map is ready to be used.
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
            .findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);

    Button addAStudio = (Button) findViewById(R.id.addAStudio);
    addAStudio.setOnClickListener(new Button.OnClickListener() {
        public void onClick(View v) {
            Intent intent = new Intent(MapsActivity.this, Rent.class);
            startActivity(intent);
        }
    });
}

@Override
public void onMapReady(GoogleMap googleMap){
    googleMap.setOnMarkerClickListener(this);
    LatLng  Copenhagen = new LatLng(55.67, 12.56);
    googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(Copenhagen, 18));
    googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
    //get marker info from Firebase Database and add to map
    addMarkersToMap(googleMap);

    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        return;
    }
    googleMap.setMyLocationEnabled(true);
}

@Override
public void onStop(){
    if(mChildEventListener != null)
        mProfileRef.removeEventListener(mChildEventListener);
    super.onStop();
}

private void addMarkersToMap(final GoogleMap map){

    mChildEventListener = mProfileRef.addChildEventListener(new ChildEventListener() {



        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                FirebaseMarker marker = dataSnapshot.getValue(FirebaseMarker.class);
                String StudioName = marker.getStudioName();
                String StudioAdress = marker.getStudioAddress();
                String StudioDescription = marker.getStudioDescription();
                double latitude = marker.getLatitude();
                double longitude = marker.getLongitude();
                LatLng location = new LatLng(latitude, longitude);

                map.addMarker(new MarkerOptions()
                        .position(location)
                        .title(StudioName)
                        .snippet(StudioAdress)
                        .snippet(StudioDescription))
                        .showInfoWindow();

        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }

    });
}

@Override
public boolean onMarkerClick(Marker marker) {
    return false;
}

而且

public class FirebaseMarker {

public String studioName;
public String studioDescription;
public String studioAddress;
public double latitude;
public double longitude;


//required empty constructor
public FirebaseMarker() {
}

public FirebaseMarker(String studioName, String studioDescription, String studioAdress, double latitude, double longitude) {
    this.studioName = studioName;
    this.studioDescription = studioDescription;
    this.studioAddress = studioAdress;
    this.latitude = latitude;
    this.longitude = longitude;
}

public String getStudioName() {
    return studioName;
}

public void setStudioName(String studioName) {
    this.studioName = studioName;
}

public String getStudioDescription() {
    return studioDescription;
}

public void setStudioDescription(String studioDescription) {
    this.studioDescription = studioDescription;
}

public String getStudioAddress() {
    return studioAddress;
}

public void setStudioAddress(String studioAddress) {
    this.studioAddress = studioAddress;
}

public double getLongitude() {
    return longitude;
}

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

public double getLatitude() {
    return latitude;
}

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

}

最后在哪里向数据库添加新标记:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_rent);
    saveStudio = findViewById(R.id.saveStudio);
    studioNameTextField = findViewById(R.id.studioNameTextField);
    studioInfoTextField = findViewById(R.id.studioInfoTextField);
    studioAdressTextField = findViewById(R.id.studioAdressTextField);
    mDatabase = FirebaseDatabase.getInstance();
    mDataBaseRef = mDatabase.getReference("Studios");
    saveStudio = findViewById(R.id.saveStudio);


    saveStudio.setOnClickListener(new Button.OnClickListener() {
        public void onClick(View v) {

                Map<String, FirebaseMarker> newStudioAdd = new HashMap<>();

                newStudioAdd.put(studioNameTextField.getText().toString(),
                        new FirebaseMarker(
                                studioNameTextField.getText().toString(),
                                studioInfoTextField.getText().toString(),
                                studioAdressTextField.getText().toString(),
                                53.669115, 12.560311
                        )
                );

                mDataBaseRef.push().setValue(newStudioAdd);

          Intent intent = new Intent(Rent.this, MapsActivity.class);
          startActivity(intent);

        }
    });

}

到目前为止,纬度和经度是硬编码的,因为我希望它在我继续之前读取标记。

共有1个答案

芮念
2023-03-14

之所以会出现这种情况,是因为Studio 1和T1的路径与T2的路径不同。正如我在数据库模式中看到的,您的T2作为额外的子级(-LH-3…GbsF),由push()方法生成。为了正确显示所有这些对象,需要所有对象具有相同的路径。因此,您可以通过以相同的方式添加Studio 1和T1来实现这一点,使用推送方法,或者通过添加T2而不使用推送方法。

FirebaseMarker firebaseMarker = new FirebaseMarker(
    studioNameTextField.getText().toString(),
    studioInfoTextField.getText().toString(),
    studioAdressTextField.getText().toString(),
    53.669115, 12.560311);
mDataBaseRef.push().setValue(firebaseMarker);

假设Studios节点是Firebase数据库的直接子节点,下面是如何在地图上添加标记:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference studiosRef = rootRef.child("Studios");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            FirebaseMarker marker = dataSnapshot.getValue(FirebaseMarker.class);
            String StudioName = marker.getStudioName();
            String StudioAdress = marker.getStudioAddress();
            String StudioDescription = marker.getStudioDescription();
            double latitude = marker.getLatitude();
            double longitude = marker.getLongitude();
            LatLng location = new LatLng(latitude, longitude);

            map.addMarker(new MarkerOptions()
                    .position(location)
                    .title(StudioName)
                    .snippet(StudioAdress)
                    .snippet(StudioDescription))
                    .showInfoWindow();
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
studiosRef.addListenerForSingleValueEvent(valueEventListener);

 类似资料:
  • 我已经花了几个小时阅读产品分支中的0和1。请在Firebase数据库有经验的人帮助我:(

  • 在我的项目中,我希望用户从Firebase实时数据中读取数据,同时他会将数据标记为锁定,直到他完成一些操作,在此期间其他用户无法读取此数据。 如果无法锁定,另一种情况是一旦他读取他同时写入一些数据以指示该数据已锁定。如果另一个用户读取此数据,他知道它已锁定。 我不确定这在火力基地是否可能。 有没有任何想法如何使用firebase实时数据库这个。

  • 我遇到的问题是fopen()、fwrite()和fclose()函数。这是我收到的错误: 警告:fopen(/db-backup-salisbury_school-20121128-021138.sql)[function.fopen]:无法打开流:在C:\inetpub\wwwroot\omarejaz\sbyschool\q5中的权限被拒绝。php在线177 警告:fwrite()要求参数1为

  • 我目前正在Android中使用静态编程语言进行培训,每当我试图访问Firebase数据库中当前的数据时都会遇到问题。下面是数据库中的数据: 数据库映像 之后,在将应用程序链接到Firebase之后,我刚刚创建了一个包含所有必需导入的主活动,但不幸的是,每当我执行应用程序并按下按钮时,什么都没有发生。 日志没有出现任何时间,它真的很烦人,因为我在留档中搜索,据我所知,这是我应该做的一切(我还检查了数

  • 我正在尝试读取我的Flutter应用程序中的firebase实时数据库中的数据,并将其分配给模型类,但是,我在控制台中得到了以下错误。 下面是我到目前为止所做的代码 员工类别 我不知道我做错了什么,请帮我解决这个问题

  • 我正在一个聊天应用程序,其中消息存储在firebase实时数据库。现在,如果我创建一个如下所示的节点(Chats-Better-A-ID和-B-ID是自动生成的聊天室密钥),那么我想知道当用户S在聊天应用程序中打开与用户T聊天时,so数据库将只读取存储在Chats-Better-S-T-ID中的消息,而不会读取其他聊天室消息!?我说的对吗?如果是,那么它会降低定价吗? 或 如果我存储如下所示的数据