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

时间:2016-05-07 23:16:18

标签: android firebase firebase-realtime-database

当我像下一个

推送值时,我想要检索firebase生成的id

Firebase

我想检索" -KGdKiPSODz7JXzlgl9J"这个电子邮件的ID 我试过getKey(),但它返回"用户" 当用户获得值时,它会将整个对象从id返回到个人资料图片,并且不会让我在我的应用程序中将其作为User对象

如何解决这个问题?

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

14 个答案:

答案 0 :(得分:62)

您可以在不推送值的情况下从push()读取密钥。稍后您可以使用该键创建一个子项并按下该键的值。

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

mGroupId包含用于索引您即将保存的值的密钥。

答案 1 :(得分:21)

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

答案 2 :(得分:14)

当您触发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());
        }
    }

答案 3 :(得分:8)

在Java - Android Studio中,当项目写入db ...

时,您可以获得唯一的推送ID
  

Per“Firebase's:在Android上保存数据”:您可以使用push()方法返回的新数据的引用来获取子项自动生成的键的值或为子项设置数据。在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 

答案 4 :(得分:6)

我解决了这个问题,你需要使用firebase url

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

这将为您提供密钥KG.....

答案 5 :(得分:3)

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

          }
     });

答案 6 :(得分:2)

在创建新的用户添加uid时,只需向userID添加新字段,就可以通过阅读查询来接收

我这样做。

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

答案 7 :(得分:1)

从firebase获取唯一Post-id的另一个选项是在@Override方法public void onChildAdded中获取密钥( 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,以后可以用来执行任何更新操作。

答案 8 :(得分:1)

我遇到了这个问题,我找到了解决方案, 你可以使用这段代码获得它:

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

答案 9 :(得分:1)

使用此

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

        }
    });

答案 10 :(得分:0)

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

            }
        });

答案 11 :(得分:0)

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

答案 12 :(得分:0)

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

答案 13 :(得分:-1)

只需执行类似操作即可:

 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