Как получить значение родительского узла в виде строки?

Изображение Firebase

Итак, в приведенной выше структуре данных я хочу получить значение Aprilia Caponord 1200 (отмечено на рис.). У меня есть ссылка Firebase на Aprilia (корневой узел), и я могу получить все данные пары ключ/значение.

Вот мой код

@override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child : dataSnapshot.getChild()) {
    Map<?, ?> value = (Map<?, ?>) child.getValue();
    String bike_price = value.get("price").toString();
    String image_url = value.get("image_url").toString();
    }
}

Итак, ясно, что я могу получить все значения дочерних узлов, имеющих отношения ключ/значение. Но я не могу конкретно получить имя родительского узла. Итак, как я могу получить значение родительского узла в формате String?

Если я напечатаю child.getValue().toString(), я получу значение JSON, но меня не интересует анализ JSON. Есть ли какой-то конкретный способ получить значение родительского узла?

{Aprilia Caponord 1200={image_url=____________, price=18.35}.. }

person capt.swag    schedule 05.06.2015    source источник


Ответы (3)


Вероятно, вы ищете метод getKey() для DataSnapshot:

    mFirebaseRef = new Firebase("https://yours.firebaseio.com");
    mFirebaseRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot child: dataSnapshot.getChildren()) {
                Log.i("MainActivity", child.getKey());
            }
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            Log.e("MainActivity", "onCancelled", firebaseError.toException());
        }
    });

Несколько замечаний:

  • Я изменил getChild() в вашем коде на getChildren(), так как мне не известен метод getChild().
  • Вам следует рассмотреть возможность использования addChildEventListener, что дает вам DataSnapshots на узлах нижнего уровня.
  • Все станет значительно проще, если вы создадите «классы-оболочки» для своих автомобилей. Затем Firebase SDK для Android автоматически развернет JSON в экземпляры этого класса. См. наш репозиторий AndroidChat для хороший пример этого.
person Frank van Puffelen    schedule 05.06.2015

Я встретил этот случай и решил, как показано ниже:

final ChildEventListener countsListener = new ChildEventListener() { //for querying how many card created by each user in a specific period
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                /**
                 * $ROOT/Apirilia/Apirilia_id/CardId/IMG_URL
                 * $ROOT/Apirilia/Apirilia_id/CardId/PRICE
                 *                      ^[key] :[value]
                 */
                if (dataSnapshot == null) {
                    Logger.e("!!! dataSnapshot is null");
                    return;
                }
                String apirilia_id = dataSnapshot.getRef().getParent().getKey();
                Logger.d("... Apirilia_id:" + apirilia_id);
            }

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

            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

            }

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

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        };

Меня ценят за то, что я могу протянуть руку помощи.

person 牟家宏    schedule 03.12.2018

для тех, кто ищет ключ в firebaseUi, тогда этот код будет работать для вас: -

firebaseadapterinstance.getRef(position).getKey();

person Prashant Kumar    schedule 10.07.2019