如何检查Firebase数据库中是否存在唯一条目?
检查Firebase数据库中指定唯一键是否存在的正确实现
你的代码逻辑存在问题,orderByChild(Objects.requireNonNull(myRef.child("Device-1").getKey()))实际上是用节点自身的键作为排序字段,再匹配null值,这完全没必要,也无法正确判断节点是否存在。下面给出两种针对性的实现方案:
方案一:直接判断节点是否存在(最简洁)
如果你的需求是检查Device-1这个节点本身是否存在,不需要构造Query,直接监听目标节点的快照即可:
myRef.child("Device-1").addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if (dataSnapshot.exists()) { Toast.makeText(getApplicationContext(), "该键已存在", Toast.LENGTH_LONG).show(); } else { Toast.makeText(getApplicationContext(), "该键不存在", Toast.LENGTH_LONG).show(); } } @Override public void onCancelled(DatabaseError databaseError) { Log.d(TAG, databaseError.getMessage()); // 不要忽略错误 } });
这里使用addListenerForSingleValueEvent而非addValueEventListener,因为只需要一次性检查节点是否存在,不需要持续监听节点变化,能减少不必要的资源消耗。
方案二:检查子节点中的唯一属性值
如果你的需求是验证某个节点下的子节点是否包含特定的唯一属性(比如设备序列号),可以通过Query实现。假设数据库结构如下:
Devices |-- Device-1 |-- serialNumber: "SN12345" |-- Device-2 |-- serialNumber: "SN67890"
要检查序列号SN12345是否已存在:
Query query = myRef.child("Devices").orderByChild("serialNumber").equalTo("SN12345"); query.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if (dataSnapshot.exists()) { Toast.makeText(getApplicationContext(), "该序列号已被使用", Toast.LENGTH_LONG).show(); } else { Toast.makeText(getApplicationContext(), "该序列号可用", Toast.LENGTH_LONG).show(); } } @Override public void onCancelled(DatabaseError databaseError) { Log.d(TAG, databaseError.getMessage()); } });
注意:使用这种查询方式时,需要在Firebase控制台的数据库规则中添加对应索引,避免性能警告:
{ "rules": { "Devices": { ".indexOn": ["serialNumber"] } } }
内容的提问来源于stack exchange,提问作者laos
相关产品推荐
相关产品推荐

