2016-05-23 40 views
20

我想在android上创建一个应用程序。我需要检查我的数据库的某个给定元素是否具有给定名称的子元素。我希望它可以利用的东西沿着线来完成:谷歌火力点检查是否存在子女

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); 

if (rootRef.childExists("name")) { 
    //run some code 
} 

我搜查,但我没有发现任何有用的东西。感谢您提前提供任何帮助。

+0

http://stackoverflow.com/a/36826793/3145960 –

+0

的[如果火力地堡存在理解数据]可能的复制( http://stackoverflow.com/questions/36826429/understanding-if-data-exists-in-firebase) –

回答

42

编辑2;值得放在最前面:我认为值得一提的是,这实际上是在此快照下载所有数据,以检查是否存在任何数据。你应该在这里留意。如果引用是巨大的(例如实际上是根引用而不是特定的子/属性),那么您应该找到一个更深的节点,您可以使用它来检查存在或设计不同的数据结构,因此可以进行高效的检查。

数据库引用实际上是该数据的URL。你想要得到数据来查看是否存在小孩。这就是为什么你似乎在寻找的方法是在DataSnapshot

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); 
rootRef.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    void onDataChange(DataSnapshot snapshot) { 
    if (snapshot.hasChild("name")) { 
     // run some code 
    } 
    } 
}); 

现在,这种设计模式感觉有点奇怪。您正在阅读整个数据库,以查看是否存在“名称”。您可以通过收听rootRef.child("name")然后检查是否snapshot.exists()来提高效率。

如果您正在尝试验证此处,而不是控制流量,则应考虑将此代码放入您的rules.json

编辑:我最初使用了错误的函数名(childExists而不是hasChild)

+0

只是为了澄清:是否可以在没有侦听器的情况下访问Firebase上的数据? – zomnombom

+2

我假设你问,因为你不想让回调反复运行。上述代码中的“单个”意味着这只会触发一次。 –

+0

是的。非常感谢! – zomnombom

1

尝试在组合使用.childexists.equalTo("Your specific name")