Значение широты / долготы Хранить в базе данных отдельно для переменной - PullRequest
0 голосов
/ 23 мая 2018

Это мои данные Firebase с использованием метода Split. Я пытаюсь отделить lat/lan значение, сохраненное в Firebase, но только первое значение отображается, но второе значение не может быть получено. Ошибка и остановка выполнения. String lat = gpsVal[0] может назначить, но String lang = gpsVal 1 не может назначить .app close.но когда я добавляю ручное значение lat / lng: (7.714195099999999,81.6947587) "в пример переменной, то можно присвоить оба значения (String lat = gpsVal [0], lang = gpsVal 1 ) переменной

Это мой код:

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];

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Это происходит потому, что вы пытаетесь использовать список locationnew за пределами onDataChange(), который всегда будет 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();
        }
    });

Или, если вы хотите использовать его вне метода, я рекомендую вам посмотреть последнюю частьмоего ответа от этого поста , в котором я объяснил, как это можно сделать с помощью пользовательского обратного вызова.Вы также можете взглянуть на это видео для лучшего понимания.

0 голосов
/ 23 мая 2018

добавьте это отдельно

 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));
}

и получите это так на карте

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...