Получить толкаемый идентификатор для определенного значения в firebase android

Я хочу получить идентификатор, сгенерированный firebase, когда я добавил значение, как показано ниже

Firebase

Я хочу получить "-KGdKiPSODz7JXzlgl9J" этот идентификатор для того электронного письма, которое я пробовал с помощью getKey(), но оно возвращает "users", и когда пользователь получает значение, он возвращает весь объект из id в изображение профиля, и это не заставит меня получить это как пользовательский объект в моем приложении

как решить это?

    Firebase users = myFirebaseRef.child("users");
    users.orderByChild("email").equalTo("[email protected]").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            dataSnapshot.getKey();
            Log.d("User",dataSnapshot.getRef().toString());
            Log.d("User",dataSnapshot.getValue().toString());
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

            Log.d("User",firebaseError.getMessage() );
        }
    });

Ответы

Ответ 1

ОБНОВЛЕНИЕ 1: он может также получить одну строку

String key = mDatabase.child("posts").push().getKey();

//************************************************ **************//

после поиска и попыток многого, я пришел к 2 способам сделать это. 1. первый, чтобы получить ключ, когда я загружаю сообщение на сервер с помощью этой функции

 public void uploadPostToFirebase(Post post) {
      DatabaseReference mFirebase = mFirebaseObject
            .getReference(Constants.ACTIVE_POSTS_KEY)
            .child(post.type);
      mFirebase.push().setValue(post);
      Log.d("Post Key" , mFirebase.getKey());
 }
  1. Я использовал его в своем коде, чтобы получить ключ после того, как я уже подтолкнул его к узлу для него в моей базе данных

    public void getUserKey(String email) {
    
        Query queryRef = databaseRef.child(Constants.USERS_KEY)
            .orderByChild(Constants.USERS_EMAIL)
            .equalTo(email);
    
        queryRef.addChildEventListener(new ChildEventListener() {
          @Override
          public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            //TODO auto generated
          }
    
          @Override
          public void onChildChanged(DataSnapshot dataSnapshot, String s) {
            //TODO auto generated;
          }
    
          @Override
          public void onChildRemoved(DataSnapshot dataSnapshot) {
            //TODO auto generated;
          }
    
          @Override
          public void onChildMoved(DataSnapshot dataSnapshot, String s) {
            //TODO auto generated
          }
    
          @Override
          public void onCancelled(DatabaseError databaseError) {
            //TODO auto generated 
          }
      });
     }
    

Ответ 2

Вы можете читать ключ от push(), не нажимая значения. Позже вы можете создать ребенка с этим ключом и нажать значения для этого ключа.

// read the index key
String mGroupId = mGroupRef.push().getKey();
....
....
// create a child with index value
mGroupRef.child(mGroupId).setValue(new ChatGroup());

mGroupId содержит ключ, который используется для индексации значения, которое вы собираетесь сохранить.

Ответ 3

Когда вы запускаете запрос Firebase, потенциально может быть несколько результатов. Поэтому, когда вы запрашиваете значение запроса, Firebase возвращает список элементов. Даже если есть только один соответствующий элемент, он будет списком одного элемента.

Таким образом, вам придется обрабатывать этот список в вашем коде:

users.orderByChild("email").equalTo("[email protected]").addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot child: dataSnapshot.getChildren()) {
            Log.d("User key", child.getKey());
            Log.d("User ref", child.getRef().toString());
            Log.d("User val", child.getValue().toString());
        }
    }

Ответ 4

В Java - Android Studio вы можете получить уникальный толкаемый идентификатор, когда элемент записывается в db...

Per "Firebase's: Save Data for Android": вы можете использовать ссылку на новые данные, возвращаемые методом push(), чтобы получить значение дочернего автоматически сгенерированного ключа или установить данные для ребенка. Вызов getKey() в ссылке push() возвращает значение автоматически сгенерированного ключа.

Чтобы получить ссылку на время записи, вместо загрузки DATA одним нажатием()...

  • используйте push() для создания пустой записи в базе данных, возвращаемое значение является ссылкой на запись.
  • используйте.getKey(), чтобы получить ключ для этой записи.
  • используйте.setValue(DATA), чтобы заполнить пустую запись

вот пример:

    FirebaseDatabase fb_db_instance = FirebaseDatabase.getInstance(); 
    DatabaseReference db_ref_Main = fb_db_instance.getReference("string_db_Branch_Name");

    hashMap_record = new HashMap<String, String>();           //some random data 
    hashMap_record.put("key_Item1", "string_Item1");
    hashMap_record.put("key_Item2", "string_Item2");

    DatabaseReference blankRecordReference = db_ref_Main ;   

    DatabaseReference db_ref = blankRecordReference.push();   //creates blank record in db
    String str_NEW_Records_Key = db_ref.getKey();             //the UniqueID/key you seek
    db_ref.setValue( hashMap_record);                         //sets the record 

Ответ 5

Я решил, что для получения идентификатора вам нужно использовать firebase url

String uid = firebaseRef.child("users").push().getKey();
Log.i("uid", uid);

это даст вам ключ KG.....

Ответ 7

Просто добавьте новое поле для пользователей, таких как userID, при создании нового User add uid и получите его, прочитав запрос

Я делаю это так.

String userID;// in Users


Firebase users = myFirebaseRef.child("users");
    users.orderByChild("email").equalTo("[email protected]").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Users user= dataSnapshot.getChildren().iterator().next().getValue(Users.class);
            Log.d("User",user.getUserID());
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            Log.d("User",firebaseError.getMessage() );
        }
    });

Ответ 8

Еще один вариант получения уникального Post-id из firebase - это получить ключ (dataSnapshot.getKey()) в методе @Override public void onChildAdded и поддерживать его локально, например

private void attachDatabaseReadListener() {
        if (mTaskEventListener == null) {
            mTaskEventListener = new ChildEventListener() {
                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                Task friendlyMessage = dataSnapshot.getValue(Task.class);
                friendlyMessage.setId(dataSnapshot.getKey());

                System.out.println("friendlyMessage  = " + friendlyMessage);

                DummyContent.ITEMS.add(new DummyContent.DummyItem("" + DummyContent.ITEMS.size()+1,friendlyMessage.getStatus(),friendlyMessage.getSummary()));
            }

            public void onChildChanged(DataSnapshot dataSnapshot, String s) {}
            public void onChildRemoved(DataSnapshot dataSnapshot) {}
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {}
            public void onCancelled(DatabaseError databaseError) {}
        };
                     mUserDatabaseReference.addChildEventListener(mTaskEventListener); // remove it
    }
}

dataSnapshot.getKey установит уникальный идентификатор сообщения в экземпляре задачи и может быть использован позже для выполнения любой операции обновления.

Ответ 9

Я столкнулся с этой проблемой, и я нашел решение, вы можете получить его с помощью этого кода:

dataSnapshot.getChildren().iterator().next().getKey()

Ответ 10

FirebaseDatabase.getInstance().getReference(FConst.PATIENTS).push().setValue(patient);

Ответ 11

FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
DatabaseReference databaseReference1 = firebaseDatabase.getReference("users");
databaseReference1.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                for(DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {

                    String key = dataSnapshot1.getKey();
                    Log.d(TAG, "onCreate: key :" + key);

                    String email = dataSnapshot1.child("email").getValue(String.class);
                    String roomno =dataSnapshot1.child("address").getValue(String.class);
                    Log.d(TAG, "onDataChange: email: " + email);
                    Log.d(TAG, "onDataChange: address: " + address)
                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

Ответ 12

Просто сделайте подобное:

 HashMap<String, Object> hashLcl = new HashMap<>();
    hashLcl.put("admin", firebaseUser.getUid());
    hashLcl.put("name", textPrm);
    DatabaseReference referenceLcl = FirebaseDatabase.getInstance().getReference();
    String keyLcl = referenceLcl.child("GroupChats").push().getKey();
    hashLcl.put("key", keyLcl);
    Task task = referenceLcl.child("GroupChats").child(keyLcl).setValue(hashLcl);
    task.addOnSuccessListener(aVoid -> {
        //the data is added and now we are sure to do something related
    });

Это результат: enter image description here