我正在尝试查找是否有办法知道Firebase实时数据库中是否有提取的数据。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// ARRAY
accountList = new ArrayList<>();
// Assigning Object to Controls (bullshit)
textboxUser = (TextView) findViewById(R.id.textBoxUsername);
textboxPass = (TextView) findViewById(R.id.textBoxPassword);
buttonEnter = (Button) findViewById(R.id.buttonEnter);
postRef = FirebaseDatabase.getInstance().getReference("account");
dataRefaccount = FirebaseDatabase.getInstance().getReference("account");
// OnClick Method Button
buttonEnter.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
username = textboxUser.getText().toString();
Query query = FirebaseDatabase.getInstance().getReference("account").orderByChild("username").equalTo(username);
query.addListenerForSingleValueEvent(valueEventListener);
} catch (Exception e) {
e.printStackTrace();
} finally {
Toast.makeText(getApplicationContext(), getted, Toast.LENGTH_LONG).show();
}
}
});
}
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot data : dataSnapshot.getChildren()) {
if (data.child(username).exists()) {
getted = "yes";
} else {
getted = "No";
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Toast.makeText(getApplicationContext(), "error", Toast.LENGTH_LONG).show();
}
};
吸气剂始终为“否”。
答案 0 :(得分:1)
您应该尝试一下。首先,请确保您在查询响应中没有收到任何错误。
Query query = FirebaseDatabase.getInstance().getReference().child("account").orderByChild("username").equalTo(username);
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.getValue() != null && dataSnapshot.getChildrenCount() > 0) {
for (DataSnapshot data : dataSnapshot.getChildren()) {
// I'm sure you are looking for below line.. Go and try this.
if (data.child("username").getValue().toString().equal(username) ) {
getted = "yes";
break;
} else {
getted = "No";
}
}
} else {
getted = No value available;
}
Toast.makeText(getApplicationContext(), "getted : " + getted, Toast.LENGTH_LONG).show();
}
@Override
public void onCancelled(DatabaseError databaseError) {
Toast.makeText(getApplicationContext(), "error", Toast.LENGTH_LONG).show();
}
};
仅供参考:Firebase调用是异步调用,因此按钮单击时的finally子句将始终在来自Firebase的响应之前执行。因此,尝试从此处删除try-catch并使用上面的代码打印获取的值。
答案 1 :(得分:0)
您可以通过调用以下命令来检查DataSnapshot
是否存在:
Query query = FirebaseDatabase.getInstance().getReference().child("account").orderByChild("username").equalTo(username);
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
getted = yes;
}else{
getted = no;
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Toast.makeText(getApplicationContext(), "error", Toast.LENGTH_LONG).show();
}
};
通过提供数据库结构,提供答案将更加容易。
答案 2 :(得分:0)
firebase社区允许检索数据的唯一方法是:您应该尝试以下代码来获取数据 用户名:
DatabaseReference bDatabaseRef;
bDatabaseRef=FirebaseDatabase.getInstance().getReference().child("Users"); bDatabaseRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.exists() && dataSnapshot.getChildrenCount()>0){
Map<String, Object> map = (Map<String, Object>) dataSnapshot.getValue();
if(map.get("Username")!=null){
String User_name =map.get("Username").toString();
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
答案 3 :(得分:0)
当您尝试使用以下代码行时:
Toast.makeText(getApplicationContext(), getted, Toast.LENGTH_LONG).show();
getted
的值将始终保持No
的值,因为当您尝试举起该消息时,数据尚未完成从数据库的加载。发生这种情况是因为onDataChange()
方法的异步行为。请注意,无法保证需要多长时间,可能需要几百毫秒到几秒钟的时间才能获得该数据。
对此问题的快速解决方案是仅在getted
方法内部或从内部使用与onDataChange()
变量相关的所有逻辑。
如果需要在回调之外使用它,我建议您从此 post 中查看anwser的最后一部分,其中我已经解释了如何使用自定义功能打回来。您也可以查看此 video 以获得更好的理解。