如何从firebase中的值获取密钥

时间:2016-07-06 19:21:38

标签: android firebase firebase-realtime-database

当我知道Firebase中以下结构中的“name”字段包含“efg”时,如何获取密钥“-KLpcURDV68BcbAvlPFy”。

clubs
    -KLpcURDV68BcbAvlPFy
        dept: "abc"
        desc: "xyz"
        name: "efg"
    -asdasdasddsad
        dept: "asda"
        desc: "asd"
        name: "adddd"

我尝试了这个,但它返回了“俱乐部”

mDatabase.child("clubs").orderByChild("name").equalTo("efg").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String clubkey =dataSnapshot.getKey();

7 个答案:

答案 0 :(得分:16)

那是因为你使用的是ValueEventListener。如果查询匹配多个子节点,则返回所有这些子节点的列表。即使只有一个匹配的孩子,它仍然是一个列表。由于您在该列表上调用getKey(),因此您将获得运行查询的位置的键。

要获取匹配子项的键,请遍历快照的子项:

mDatabase.child("clubs")
         .orderByChild("name")
         .equalTo("efg")
         .addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
            String clubkey = childSnapshot.getKey();

但请注意,如果您认为俱乐部名称是唯一的,您可以将俱乐部存储在他们的名下,并在没有查询的情况下访问正确的俱乐部:

mDatabase.child("clubs")
         .child("efg")
         .addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String clubkey = dataSnapshot.getKey(); // will be efg

答案 1 :(得分:1)

如果有人需要使用Kotlin进行此操作:

mDatabase.child("clubs")
        .orderByChild("name")
        .equalTo("efg")
        .addListenerForSingleValueEvent(object: ValueEventListener {

            override fun onDataChange(dataSnapshot: DataSnapshot) {

                dataSnapshot.children.forEach {
                     //"it" is the snapshot
                     val key: String = it.key.toString()
                }
            }

            override fun onCancelled(p0: DatabaseError) {
                    //do whatever you need
            }
         })

答案 2 :(得分:1)

firebaseDatabase = FirebaseDatabase.getInstance();
mReference = firebaseDatabase.getReference("clubs");

mReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot ds: dataSnapshot.getChildren()){
            String key = ds.getKey();
        }
    }
}

答案 3 :(得分:0)

如果此密钥(asdasdasddsad)也具有名称:“ efg”,则俱乐部密钥将变为asdasdasddsad和KLpcURDV68BcbAvlPFy

答案 4 :(得分:0)

我们可以使用HashMap。

初始化:

用于存储键值的字符串。用于存储数据的ModelClass。

val hashMap: HashMap<String, "Your Model Class"> = hashMapOf()
databaseReference.child("/Product").orderByChild("ProductName")
        .addValueEventListener(object : ValueEventListener {
            override fun onCancelled(p0: DatabaseError) {

            }

            override fun onDataChange(p0: DataSnapshot) {
                /*p0.children.mapNotNullTo(models) { it.getValue(ProductModel::class.java) }.run {

                }*/
                p0.children.forEach {
                    val value = it.getValue(ProductModel::class.java) as ProductModel
                    hashMap[it.key!!] = value
                }.run { adp.update(hashMap) }
            }
        })

在此之后,我们还可以使用(index)获取键及其值

5是索引

hashMap.keys.elementAt(5)
hashMap.values.elementAt(5)

答案 5 :(得分:0)

我已经找到了一种非常简单的方法。您需要先获取自动生成的密钥,然后才能将其发送到Firebase。因此,对于我的项目,我做了如下操作:

var database = firebase.database();
var rootRef = database.ref();
var autoId = rootRef.push().key
rootRef.child(autoId).set({
key: value,
key: value,
key: value,
autoid: autoId
})

现在,当我使用我的孩子添加的功能并拍摄快照时,我可以轻松进入snapshot.val().autoid并将其存储在变量中或作为按钮属性,以便以后可以删除它。

答案 6 :(得分:0)

这是我在科特林所做的事情

var ref  = database.child("clubs")
val database_listener = object : ValueEventListener {
        override fun onDataChange(dataSnapshot: DataSnapshot) {
            for (ds in dataSnapshot.children) {
                val key = ds.key
           }
        }
     }
   ref.addValueEventListener(database_listener)