有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何显示firebase数据库中的所有标记?

如何显示firebase数据库中的所有标记

我已将以下表格中的数据输入数据库:

enter image description here

但仅显示图形中高亮显示的内容!我这样写代码:

@Override
public void onMapReady(GoogleMap googleMap) {
    if (!isOnline() && !isNetworkAvailable()) {
    } else {
        Map1 = googleMap;
        Map1.setMapType(GoogleMap.MAP_TYPE_NORMAL);

        Map1.setMapStyle(mapStyleOptions);
        Map1.setOnMyLocationButtonClickListener(this);
        Map1.setOnMyLocationClickListener(this);
        if (Map1 == null) {
            Map1.setMyLocationEnabled(true);
        }
        startCurrentLocationUpdates();

        mHandler.postDelayed(new Runnable(){
            public void run(){
                DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
                DatabaseReference uidRef = rootRef.child("Markers");
                Map.clear();
                ValueEventListener valueEventListener = new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        for(DataSnapshot ds: dataSnapshot.getChildren()) {

                            String latitude = ds.child("latitude").getValue().toString();
                            String longitude = ds.child("longitude").getValue().toString();
                            String bus = ds.child("bus_station").getValue().toString();
                            Log.d("TAG", latitude + ", " + longitude);
                            LatLng location = new LatLng(Double.parseDouble(latitude), Double.parseDouble(longitude));

                                Map.addMarker(new MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.img_4662878)).position(location).title(bus));
                            }}}}

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {
                        Log.d("TAG", databaseError.getMessage()); //Don't ignore errors!
                    }
                };
                uidRef.addListenerForSingleValueEvent(valueEventListener);


                mHandler.postDelayed(this, delay);
            }
        }, delay);
    }}

告诉我如何正确显示数据库中的所有标记

错误:

2020-04-22 23:10:12.031 18972-18972/by.sviter.stop E/AndroidRuntime: FATAL EXCEPTION: main
Process: by.sviter.stop, PID: 18972
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.trim()' on a null object reference
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1838)
    at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
    at java.lang.Double.parseDouble(Double.java:538)
    at by.sviter.stoprevizor.tabs.maps.MapsFragment$3$1.onDataChange(MapsFragment.java:337)
    at com.google.firebase.database.Query$1.onDataChange(com.google.firebase:firebase-database@@19.2.1:179)
    at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@19.2.1:75)
    at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@19.2.1:63)
    at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@19.2.1:55)
    at 安卓.os.Handler.handleCallback(Handler.java:873)
    at 安卓.os.Handler.dispatchMessage(Handler.java:99)
    at 安卓.os.Looper.loop(Looper.java:193)
    at 安卓.app.ActivityThread.main(ActivityThread.java:6718)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.安卓.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:495)
    at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:858)

共 (3) 个答案

  1. # 1 楼答案

    对于SingleValueEvent,您应该使用addValueEventListner而不是AddListener

    您必须运行for循环以获取所有数据,如

    DatabaseReference rootRef=FirebaseDatabase。getInstance()。getReference(); rootRef。子(“标记”)。addValueEventListner(新的ValueEventListner{

    @覆盖 公共void onDataChange(DataSnapshot DataSnapshot){ 对于(DataSnapshot快照:DataSnapshot.getChildern()){ 加入你的模范班 } }

        @Override
        public void onCancelled(DatabaseError databaseError) {
    
        }
    

    })

  2. # 2 楼答案

    假设dn4O ... mgG2是经过身份验证的用户的uid,要获取纬度和经度属性的值,请使用以下代码行:

    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference uidRef = rootRef.child("Markers").child(uid);
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String latitude = dataSnapshot.child("latitude").getValue(String.class);
            String longitude = dataSnapshot.child("longitude").getValue(String.class);
            Log.d("TAG", latitude + ", " + longitude);
            LatLng location = new LatLng(Double.parseDouble(latitude), Double.parseDouble(longitude));
    
            //Do what you need to do with the location
        }
    
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Log.d("TAG", databaseError.getMessage()); //Don't ignore errors!
        }
    };
    uidRef.addListenerForSingleValueEvent(valueEventListener);
    

    logat中的结果将是:

    53.9148950..., 27.4380507...
    

    编辑:

    根据你的评论:

    how to show all the tags?

    请使用以下代码行:

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference markersRef = rootRef.child("Markers");
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                String latitude = ds.child("latitude").getValue(String.class);
                String longitude = ds.child("longitude").getValue(String.class);
                Log.d("TAG", latitude + ", " + longitude);
                LatLng location = new LatLng(Double.parseDouble(latitude), Double.parseDouble(longitude));
    
                //Add the location to a list of locations
            }
        }
    
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Log.d("TAG", databaseError.getMessage()); //Don't ignore errors!
        }
    };
    markersRef.addListenerForSingleValueEvent(valueEventListener);
    

    logcat中的结果将是:

    // ...
    // ...
    53.9148950..., 27.4380507...
    
  3. # 3 楼答案

    在DataSnapshot for loop的作用域结束后,可以使用本应实现的getter和setter操作DataModel对象的内容

    如果这不起作用。检查mMarkers1对象是否指向正确的类,或者将addListenerForSingleValueEvent更改为addValueEventListener