Android 检查是否存在子级,并从firebase检索简单数据
Android 检查是否存在子级,并从firebase检索简单数据,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,这是我的firebase数据库。在第一个节点中,我有一个子节点,在第二个节点中没有。我想检查是否存在,如果没有创建一个,如果存在,如何简单地检索它,而不需要任何模型或回调?有可能吗?注意:没有回拨,您无法读取任何数据。 现在您必须了解firebase中的回调之间的区别,有3个回调(所有这3个回调都被视为数据读取器): 添加的子项: 在添加子项时触发。(这不是你需要的) 值事件侦听器: 在添加或修改子项时触发。(这不是你需要的) 单值事件的侦听器: 仅在连接后触发,不会再次触发(这是您需要的) 因
这是我的
firebase
数据库。在第一个节点中,我有一个子节点,在第二个节点中没有。我想检查是否存在,如果没有创建一个,如果存在,如何简单地检索它,而不需要任何模型或回调?有可能吗?注意:没有回拨,您无法读取任何数据。
现在您必须了解firebase中的回调之间的区别,有3个回调(所有这3个回调都被视为数据读取器):
添加的子项:
在添加子项时触发。(这不是你需要的)
值事件侦听器:
在添加或修改子项时触发。(这不是你需要的)
单值事件的侦听器:
仅在连接后触发,不会再次触发(这是您需要的)
因此,正如您现在所看到的,当您需要只读取必须为单值事件调用侦听器的数据时
示例:
假设您要检查某个随机id下是否存在been
,您必须执行以下操作:
//this is a method that you call when you need to read the node and do the check.
public void checkBeenThere(String random_id){
DatabaseReference places_ref = FirebaseDatabase.getInstance().getReference().child("Places");
places_ref.child(random_id).addListenerForSingleValueEvent(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot datasnapshot){
//check if Been there exist
if(datasnapshot.hasChild("BeenThere")){
//been there is found
//get the value of been there (THIS IS THE EDIT***).
int been_there = datasnapshot.child("BeenThere").getValue(Integer.class);
}else{
//been there is not found
//add it under the specific random id
places_ref.child(random_id).child("BeenThere").setValue(0);
}
}
@Override
public void onCnacelled(DatabaseError error){
}
});
}
如果您对随机id感到困惑,它只是您在数据库结构中拥有的id(例如:ChIJZZ………),您需要传递该id以检查其下是否存在
假设我想检查ChIJZZ下是否存在……我这样做:
//you must type the whole id, I added .... because it is long.
checkBeenThere("ChIJZZ_sM.......");
所有从数据库获取数据的Firebase API都涉及回调。我尝试了ValueEventListener,但它只在添加或修改数据时返回结果。我只想简单地阅读数据。请编辑您的问题以显示您尝试过的代码,并解释它如何不满足您的需要。你现在描述的问题听起来与你目前在问题中所写的非常不同。我将尝试一下并通知你!谢谢你的时间和回答:)我明白了。如果它在那里,我可以检查BeenTherr是否在那里,如果没有,则将其设置为0。但是如何读取这些数据呢
dataSnapshot.child(“BeenThere”).getValue()
我尝试过并导致错误。@BikramNath我更新了代码,以便您可以获取(BeenThere)的值。编辑可以在onDataChange()方法中包含的注释(这是编辑**)下找到。你真是一个了不起的人!这很好用。我尝试并成功地使用了一种混乱的方法,将数据作为字符串获取,然后转换为int:D(谢谢,伙计:)