获取 firebase 中特定值的推送 ID android

Get the pushed ID for specific value in firebase android

我想像下一个一样检索 firebase 生成的 id,当我向它推送值时

我想为该电子邮件检索“-KGdKiPSODz7JXzlgl9J”这个 ID 我尝试了 getKey() 但它 return "users" 当用户获得它的价值时 return 从 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() );
        }
    });

当您触发 Firebase 查询时,可能会有多个结果。因此,当您请求查询的值时,Firebase returns 一个项目列表。即使只有一个匹配的项目,它也会是一个项目的列表。

因此您必须在代码中处理此列表:

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

只需向用户添加新字段,如 userID,当您创建新用户时添加 uid,然后您可以通过读取查询接收它

我是这样做的。

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

在 Java - Android Studio 中,您可以在将项目写入数据库时​​获得唯一的推送 ID...

Per "Firebase's: Save Data on Android": You can use the reference to the new data returned by the push() method to get the value of the child's auto-generated key or set data for the child. Calling getKey() on a push() reference returns the value of the auto-generated key.

要在写入时获取引用,而不是使用单个 push() 加载数据...

  • 使用push()在数据库中创建一条空白记录,return值是记录的引用。
  • 使用 .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 

我解决了它以获取您需要使用 firebase 的 id url

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

这会给你钥匙KG.....

更新 1: 也可以一行获取

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

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

在搜索并尝试了很多东西之后,我找到了 2 种方法来做到这一点 . 1. 当我通过此函数

将 post 上传到服务器时,第一个获取密钥的人
 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 
          }
      });
     }
    

对于使用 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();

          }
     });

您可以从 push() 中读取密钥,而无需推送值。稍后您可以使用该键创建一个子项并推送该键的值。

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

mGroupId 包含用于索引您要保存的值的键。

从 firebase 获取唯一 Post-id 的另一种方法是在 @Override 方法 [=21] 中获取密钥 (dataSnapshot.getKey()) =] 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 将在任务实例中设置唯一的 post id,以后可用于执行任何更新操作。

我遇到过这个问题并且找到了解决方案, 您可以使用此代码获取它:

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

简单类似:

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

这是结果:

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

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

是的,您可以通过在特定子项中将其名称添加为键和值来检索节点或主要子项名称 {main_child_name}