【问题标题】:Lat/Lng value Store in firebase separately assign to variableLat/Lng 值存储在 Firebase 中,分别分配给变量
【发布时间】:2018-05-23 11:06:12
【问题描述】:

This is my firebase data 使用拆分方法我尝试分离存储在 Firebase 中的 lat/lan 值,但仅显示第一个值但无法获取第二个值。发生错误并停止运行。字符串 lat=gpsVal[0] 可以分配,但字符串 lang =gpsVal1无法assign.app关闭。 但是当我将手动值 lat/lng: (7.714195099999999,81.6947587)" 添加到示例变量时,可以将两个值(String lat=gpsVal[0],lang=gpsVal1)分配给变量

这是我的代码:

final ArrayList <String> locationnew = new ArrayList <String>();
    database.orderByChild("ItemName").equalTo(name).addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot){
                    for(DataSnapshot suggestionSnapshot : dataSnapshot.getChildren())
                    {
                         itcat=suggestionSnapshot.getKey();
                         String loc=suggestionSnapshot.child("ShopLocation").getValue().toString();
                         names1.add(itcat);
                         locationnew.add(loc);

                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                   // Toast.makeText(getApplicationContext(), "AWW SNAP... Something is Wrong.", Toast.LENGTH_LONG).show();
                }
            });

        String[] loca=new String[1000];

        for(int i=0; i < locationnew.size(); i++)
        {
            loca[i]=locationnew.get(i);
        }

        String find_lat_lan = "";
        serch2.setText(String.valueOf(loca[0]));
        String example = serch2.getText().toString();
        Matcher m = Pattern.compile("\\(([^)]+)\\)").matcher(example);
        while(m.find()) {
            find_lat_lan = m.group(1) ;
        }

        String[] gpsVal = find_lat_lan.split(",");
        String lat=gpsVal[0];
        String lang=gpsVal[1];

【问题讨论】:

    标签: java android firebase arraylist firebase-realtime-database


    【解决方案1】:

    发生这种情况是因为您尝试在onDataChange() 之外使用locationnew 列表,由于此方法的异步行为,该列表将始终为empty

    换句话说,您现在无法返回尚未加载的内容。您不能简单地在 onDataChange() 方法之外使用该结果,因为当您尝试在该方法之外使用该 list 时,数据尚未从数据库中完成加载,这就是无法访问的原因。快速解决此问题的方法是将所有逻辑仅移动到 onDataChange() 方法中,如下所示:

        final ArrayList <String> locationnew = new ArrayList <String>();
        database.orderByChild("ItemName").equalTo(name).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot){
                for(DataSnapshot suggestionSnapshot : dataSnapshot.getChildren())
                {
                    itcat=suggestionSnapshot.getKey();
                    String loc=suggestionSnapshot.child("ShopLocation").getValue().toString();
                    names1.add(itcat);
                    locationnew.add(loc);
    
                }
                String[] loca=new String[1000];
    
                for(int i=0; i < locationnew.size(); i++)
                {
                    loca[i]=locationnew.get(i);
                }
    
                String find_lat_lan = "";
                serch2.setText(String.valueOf(loca[0]));
                String example = serch2.getText().toString();
                Matcher m = Pattern.compile("\\(([^)]+)\\)").matcher(example);
                while(m.find()) {
                    find_lat_lan = m.group(1) ;
                }
    
                String[] gpsVal = find_lat_lan.split(",");
                String lat=gpsVal[0];
                String lang=gpsVal[1];
            }
    
            @Override
            public void onCancelled(DatabaseError databaseError) {
    
                // Toast.makeText(getApplicationContext(), "AWW SNAP... Something is Wrong.", Toast.LENGTH_LONG).show();
            }
        });
    

    或者如果你想在方法之外使用它,我建议你从这个 post 中查看我的 anwser 的最后一部分,我在其中解释了如何使用自定义回调来完成.您也可以看看这个 video 以获得更好的理解。

    【讨论】:

    • 非常感谢 Alex Mamo。你卖了我的问题。我尝试了很多小时来解决它。并感谢您的建议
    【解决方案2】:

    单独添加

     private void subscribeToUpdates() {
        DatabaseReference ref = FirebaseDatabase.getInstance().getReference(getString(R.string.firebase_path));
    
        ref.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
                setMarker(dataSnapshot);
            }
    
            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) {
                setMarker(dataSnapshot);
                Log.d("markerKey", "hello: " + dataSnapshot.getKey());
                String key = dataSnapshot.getKey();
    //                subscribeUpdates(key);
            }
    
            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) {
            }
    
            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {
            }
    
            @Override
            public void onCancelled(DatabaseError error) {
                Log.d(TAG, "Failed to read value.", error.toException());
            }
        });
    }
    
    private void setMarker(DataSnapshot dataSnapshot) {
        // When a location update is received, put or update
        // its value in mMarkers, which contains all the markers
        // for locations received, so that we can build the
        // boundaries required to show them all on the map at once
        String key = dataSnapshot.getKey();
    // not important
        newName = key.replace(" ", ".");
        HashMap<String, Object> value = (HashMap<String, Object>) dataSnapshot.getValue();
        double lat = Double.parseDouble(value.get("latitude").toString());
        double lng = Double.parseDouble(value.get("longitude").toString());
        LatLng location = new LatLng(lat, lng);
        if (!mMarkers.containsKey(key)) {
            mMarkers.put(key, mMap.addMarker(new MarkerOptions().title(newName).position(location)
                    .icon(BitmapDescriptorFactory.defaultMarker(colours[new Random().nextInt(colours.length)]))));
        } else {
            mMarkers.get(key).setPosition(location);
        }
    
        LatLngBounds.Builder builder = new LatLngBounds.Builder();
        for (Marker marker : mMarkers.values()) {
            builder.include(marker.getPosition());
        }
        mMap.animateCamera(CameraUpdateFactory.newLatLngBounds(builder.build(), 300));
    }
    

    并在地图上像这样接收它

    【讨论】:

    • 使用 google api 自动完成方法我将位置添加到数据库中。如果我打印 (find_lat_lan) 它会显示 7.714195099999999,81.6947587 但发生错误将其与逗号分开
    • find_lat_lan = m.group(1) ;给你字符串???没有错误?因为如果这是 null 当然你会得到错误
    猜你喜欢
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 2011-06-27
    • 2013-04-22
    相关资源
    最近更新 更多