Google firebase 检查孩子是不是存在
Posted
技术标签:
【中文标题】Google firebase 检查孩子是不是存在【英文标题】:Google firebase check if child existsGoogle firebase 检查孩子是否存在 【发布时间】:2016-09-20 16:49:13 【问题描述】:在我的应用程序中,我需要检查我在 firebase 上的数据库的给定元素是否有一个具有给定名称的子元素。我希望可以通过使用以下方式来完成:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
if (rootRef.childExists("name"))
//run some code
我搜索过,但找不到任何有用的东西。
【问题讨论】:
***.com/a/36826793/3145960 Understanding if data exists in Firebase的可能重复 【参考方案1】:编辑 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
。
edit:我原来使用了错误的函数名(childExists而不是hasChild)
【讨论】:
澄清一下:是否可以在没有监听器的情况下访问 firebase 上的数据? 我假设你在问是因为你不希望回调一遍又一遍地运行。上面代码中的“single”表示这只触发一次。 是的。非常感谢! ***.com/questions/43752247/… 如果DatabaseReference不存在onDataChange不调用,因为没有任何数据,调用方法onCancelled()【参考方案2】:不要这样做
从不
它将把你所有的数据带到设备上
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
rootRef.addListenerForSingleValueEvent(new ValueEventListener()
@Override
void onDataChange(DataSnapshot snapshot)
if (snapshot.hasChild("name"))
// run some code
);
通过这种方式检查。 如果存在,它将返回孩子的值,否则 -> null
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
rootRef.child("childName")
rootRef.addListenerForSingleValueEvent(new ValueEventListener()
@Override
void onDataChange(DataSnapshot snapshot)
if (snapshot.getValue() == null)
// The child doesn't exist
);
【讨论】:
我不能用snapshot.exists()
吗?
在向根节点添加侦听器时编写“rootRef.child("childName")”没有意义。你在发布之前测试过你的代码吗?【参考方案3】:
一个完整的解决方案。无需下载所有数据。只需检查孩子是否像这样存在:
// Assuming the names are in the name node. Remove "name/" if not
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference("name/" + name);
rootRef.addListenerForSingleValueEvent(new ValueEventListener()
@Override
public void onDataChange(DataSnapshot snapshot)
if (snapshot.exists())
// Exist! Do whatever.
else
// Don't exist! Do something.
@Override
public void onCancelled(DatabaseError error)
// Failed, how to handle?
);
【讨论】:
【参考方案4】:尝试将.childexists
与.equalTo("Your specific name")
结合使用
【讨论】:
【参考方案5】:UsersRef = FirebaseDatabase.getInstance().getReference();
Users.addListenerForSingleValueEvent(new ValueEventListener()
@Override
public void onDataChange(DataSnapshot snapshot)
if (snapshot.hasChild("childName"))
// it exists!
else
// does not exist
@Override
public void onCancelled(@NonNull DatabaseError databaseError)
);
【讨论】:
【参考方案6】:使用 snapshot.exists() 检查引用的数据库条目是否包含 child ,无论 child 的值如何。
【讨论】:
以上是关于Google firebase 检查孩子是不是存在的主要内容,如果未能解决你的问题,请参考以下文章
如何检查用户是不是刚刚在 Firebase 中首次登录 Google
Firebase - 检查使用 Google 帐户创建的用户是不是正在注册或登录?