programing

파이어베이스 안드로이드에서 특정 값에 대한 푸시된 ID 가져오기

bestprogram 2023. 6. 26. 21:30

파이어베이스 안드로이드에서 특정 값에 대한 푸시된 ID 가져오기

다음과 같이 값을 눌렀을 때 Firebase에서 생성된 id를 검색하고 싶습니다.

Firebase

"-KGdKiPSODz7JXzlgl9"를 검색하고 싶습니다.J" getKey()로 시도한 이메일에 대한 이 ID는 "users"를 반환하고 사용자가 값을 얻으면 ID에서 프로필 사진으로 전체 개체를 반환합니다. 그러면 앱에서 사용자 개체로 가져올 수 없습니다.

이것을 어떻게 해결합니까?

    Firebase users = myFirebaseRef.child("users");
    users.orderByChild("email").equalTo("z@m.com").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() );
        }
    });

값을 누르지 않고 push()에서 키를 읽을 수 있습니다.나중에 해당 키를 사용하여 하위 키를 생성하고 해당 키의 값을 푸시할 수 있습니다.

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

mGroupId저장하려는 값을 인덱싱하는 데 사용되는 키가 들어 있습니다.

업데이트 1: 한 줄로도 얻을 수 있습니다.

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

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

많은 것들을 검색하고 시도한 후에 나는 그것을 하는 두 가지 방법으로 왔습니다. 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 
          }
      });
     }
    

Firebase 쿼리를 실행하면 여러 결과가 발생할 수 있습니다.따라서 쿼리 값을 요청하면 Firebase는 항목 목록을 반환합니다.일치하는 항목이 하나만 있더라도 하나의 항목 목록이 됩니다.

따라서 코드에서 이 목록을 처리해야 합니다.

users.orderByChild("email").equalTo("z@m.com").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());
        }
    }

Java - Android Studio에서 항목이 DB에 기록될 때 고유한 푸시 ID를 얻을 수 있습니다...

"Firebase: Android에서 데이터 저장" 기준:푸시() 메서드에서 반환한 새 데이터에 대한 참조를 사용하여 자식의 자동 생성 키 값을 가져오거나 자식의 데이터를 설정할 수 있습니다.푸시() 참조에서 getKey()를 호출하면 자동으로 생성된 키의 값이 반환됩니다.

한 번의 푸시()로 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 

파이어베이스 URL을 사용해야 하는 ID를 얻기 위해 해결했습니다.

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

이것이 당신에게 열쇠를 줄 것입니다.KG.....

TVAC 튜토리얼(https://www.youtube.com/watch?v=cSMMWOHkP68&list=PLGCjwl1RrtcTXrWuRTa59RyRmQ4OedWrt&index=16) 을 사용하는 사용자를 위한 것입니다.

다음과 같이 onClick 방법을 사용하여 Key를 얻을 수 있습니다.

   viewHolder.mView.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View v) {

           String key = getRef(position).getKey();

          }
     });

사용자와 같은 사용자에 새 필드를 추가하기만 하면 됩니다.새 사용자 추가 ID를 만들 때 쿼리를 읽음으로써 ID를 수신할 수 있습니다.

이렇게 하고 있습니다.

String userID;// in Users


Firebase users = myFirebaseRef.child("users");
    users.orderByChild("email").equalTo("z@m.com").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() );
        }
    });

저는 이 문제에 직면했고 해결책을 찾았습니다. 다음 코드를 사용하여 해결책을 얻을 수 있습니다.

dataSnapshot.getChildren().iterator().next().getKey()
 // Unity, code in C#
{
 reference = FirebaseDatabase.DefaultInstance.RootReference;
 string s = reference.Push().Key;
 reference.Child(s).Child(Username).SetValueAsync(Username);
 Debug.Log(s);
}

파이어베이스에서 고유한 Post-id를 가져오는 또 다른 옵션은 ChildAdded의 @Override 메서드 public void에 키(dataSnapshot.getKey())를 가져와 로컬로 유지하는 것입니다.

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는 작업 인스턴스에서 고유한 게시 ID를 설정하며 나중에 업데이트 작업을 수행하는 데 사용할 수 있습니다.

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) {

            }
        });

사용

 mFirebaseDatabase=mFirebaseDatabase.getInstance().getReference("tablename");
 Query query = mFirebaseDatabase.orderByChild("tablenme").getRef();


    query.orderByChild("Id").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
                String id =dataSnapshot1.child("Id").getKey();

                    String Name = dataSnapshot1.child("Name").getValue().toString();
                    String lastName= dataSnapshot1.child("lastname").getValue().toString();
                    flatDataGets.add(Name+"-"+lastname);



            }

            ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(RagisterActivity.this, R.layout.support_simple_spinner_dropdown_item, DataGets);
            arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            mRegisterSpinner.setAdapter(arrayAdapter);
            mRegisterSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                  flatName =DataGets.get(position);


                }

                @Override
                public void onNothingSelected(AdapterView<?> parent) {

                }

            });

        }


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

        }
    });

이름을 와 값으로 할 수 . 예 또 노 는 기 드 본 자 을 값 및 로 하 여 추 으 가 있 다 니 습 수 할 색 검 키 식 름 의 름 이 이 ▁name ▁or ▁child ▁yes ▁the 예 , ▁adding ▁as ▁by ▁retrieve 노 드 ▁node ▁its ▁main ▁can ▁value ▁you ▁partic ▁and 또 ▁a는 니 여{main_child_name}.

유사한 작업만 수행합니다.

 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

언급URL : https://stackoverflow.com/questions/37094631/get-the-pushed-id-for-specific-value-in-firebase-android