当我知道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();
答案 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)