我正在通过我的应用程序中的searchview从firebase数据库中检索用户名。它给了我输出。但问题是我在吐司中显示了一条消息"用户未找到"只要用户名在数据库中不可用,就应该显示该信息。但它显示了用户名是否可用的时间。我不知道如何解决它。 这是我的代码:
databaseReference = FirebaseDatabase.getInstance().getReference("Users");
databaseref = databaseReference.child("usernames");
searchView.setOnQueryTextListener(new
android.widget.SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(final String query) {
if(CheckNetwork.isInternetAvailable(Search.this))
{
databaseref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot data : dataSnapshot.getChildren())
{
name = data.getKey().toString();
pic = data.child("image").getValue(String.class);
id = data.child("id").getValue(String.class);
if(query.equals(name)) {
textView.setText(name);
Picasso.with(getApplicationContext()).load(pic).fit().centerCrop().into
(imageView);
}
else {
Toast.makeText(Search.this, "No user found", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
else {
Toast.makeText(Search.this,"No internet
Connection",Toast.LENGTH_SHORT).show();
}
return true;
}
这是我的数据库图片:
答案 0 :(得分:0)
您尚未按用户名过滤用户列表:
databaseref.child(query).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
name = dataSnapshot.getKey().toString();
pic = dataSnapshot.child("image").getValue(String.class);
id = dataSnapshot.child("id").getValue(String.class);
您会注意到我删除了循环,因为在这种情况下,侦听器附加到特定位置:您在搜索框中输入其名称/密钥的用户的节点。
如果您要过滤名称/键以搜索框中的内容开头的用户,而不是特定值,则需要数据库查询:
databaseref.orderByKey().startAt(query).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) {
name = userSnapshot.getKey().toString();
pic = userSnapshot.child("image").getValue(String.class);
id = userSnapshot.child("id").getValue(String.class);
答案 1 :(得分:0)
当您在搜索框中输入值时,您现在指定了节点,因此无需循环屏幕截图值相当于您要查找的值,因此您可以直接说:
dataSnapshot.child("image")getValue(String.class)
答案 2 :(得分:0)
对于您当前的代码,问题是您正在烘烤"用户未找到"在完成所有快照的解析之前。例如:如果您的用户是您的代码将显示的第二个快照"用户未找到"对于第一个快照而不检查第二个快照。因此,您可以通过使用布尔值设置为true来更改它,如果找到并在for循环后检查该布尔值。喜欢:
Boolean userFound = false;
for(DataSnapshot data : dataSnapshot.getChildren())
{
name = data.getKey().toString();
pic = data.child("image").getValue(String.class);
id = data.child("id").getValue(String.class);
if(query.equals(name)) {
textView.setText(name);
userFound = true;
Picasso.with(getApplicationContext()).load(pic).fit().centerCrop().into(imageView);
}
}
if(!userFound){
Toast.makeText(Search.this, "No user found", Toast.LENGTH_SHORT).show();
}
还有一个更好的解决方案,你没有必要解析所有用户,尝试@Frank van Puffelen回答。
您可以通过databaseRef.child("query");
直接与孩子联系。
答案 3 :(得分:0)
我找到了解决方案:)
databaseref.orderByKey().equalTo(query).addValueEventListener(new
ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot data : dataSnapshot.getChildren()) {
name = data.getKey().toString();
pic = data.child("uri").getValue(String.class);
id = data.child("id").getValue(String.class);
}
if(query.equals(name)) {
textView.setText(name);
Picasso.with(getApplicationContext()).load(pic).fit().centerCrop().into
(imageView);
}
else {
Toast.makeText(Search.this, "No user found", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});