使用firebase数据库检查值是否存在

时间:2018-02-01 14:18:14

标签: android firebase-realtime-database

我只是希望我的代码在我点击我的按钮时检查数据库中是否已经存在值,但不知何故它没有返回任何值。我想我已经按照互联网上的教程,但不确定为什么它对我不起作用。

我的数据库如下所示: enter image description here

这是我的onclick方法:

@Override
public void onClick(View v) {
    try {
        InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        Intent intent;

        switch (v.getId()) {
            case R.id.textViewLoginHere:
                intent = new Intent(ActivityRegister.this, ActivityLogin.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(intent);
                break;
            case R.id.buttonRegister:
                progressBar.setVisibility(View.VISIBLE);
                checkIfUsernameExists();
                break;

        }
    }catch (Exception e){
        Toast.makeText(ActivityRegister.this, e.getLocalizedMessage(), Toast.LENGTH_SHORT).show();
    }
}

这是检查值是否存在的方法:

public void checkIfUsernameExists(){
        username = editTextUsername.getText().toString().trim();
        DatabaseReference usernameRef = FirebaseDatabase.getInstance().getReference("usernames");
        usernameRef.orderByValue().equalTo(username).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {
                    Toast.makeText(ActivityRegister.this, "exists", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(ActivityRegister.this, "not exists", Toast.LENGTH_SHORT).show();
                }
                enableButton();
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

我的代码有什么问题以及我如何修复它?提前谢谢

3 个答案:

答案 0 :(得分:0)

试试这个..

 public void checkIfUsernameExists(){
        username = editTextUsername.getText().toString().trim();
        DatabaseReference usernameRef = FirebaseDatabase.getInstance().getReference("usernames");
        usernameRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                for (DataSnapshot data : dataSnapshot.getChildren()) {
                    String user = (String) data.getValue();

                    if (user.equals(username)) {
                        Toast.makeText(ActivityRegister.this, "exists", Toast.LENGTH_SHORT).show();
                        enableButton();
                    } else {
                        Toast.makeText(ActivityRegister.this, "not exists", Toast.LENGTH_SHORT).show();
                    } 

                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

在这里的示例中,您将获得“用户名”参考

 DatabaseReference usernameRef = FirebaseDatabase.getInstance().getReference("usernames");

在响应onDataChange()上我们将获取dataSnapshot对象,该对象检索有关此引用的所有数据

然后我们将为我们收到的dataSnapshot中的所有孩子制作一个循环

示例中的孩子是:

  • FMt7S4ybHcf2f .... OT2
  • ioRdDue ...... sE22

然后我们通过data.getValue()

获得孩子的价值

并检查此子项中的值是否等于用户名

答案 1 :(得分:0)

当您使用dataSnapshot.exists()时,这意味着您正在检查是否存在节点,该节点是一个对象。您没有检查值的existens,在本例中是一个String。因此,为了查看对象中是否存在值,您需要遍历该对象的子元素。 所以请使用以下代码:

public void checkIfUsernameExists(){
    username = editTextUsername.getText().toString().trim();
    DatabaseReference usernameRef = FirebaseDatabase.getInstance().getReference().child("usernames");
    usernameRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                String user = ds.getValue(String.class);

                if (user.equals(username)) {
                    Toast.makeText(ActivityRegister.this, "exists", Toast.LENGTH_SHORT).show();
                    enableButton();
                } else {
                    Toast.makeText(ActivityRegister.this, "not exists", Toast.LENGTH_SHORT).show();
                } 
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {}
    });
}

正如您可能看到的那样,我使用getChildren()方法迭代DataSnapshot对象以实际获取所有这些孩子。拥有这些孩子,我们可以获得价值,看看其中一个是否与我们正在寻找的孩子相等。在平等的情况下,我们敬酒exists,否则not exists

答案 2 :(得分:0)

我的错误根本原因是因为规则。这是一个注册页面,因此用户仍未获得授权。我只是将其更改为:

package ru.documentum.sbis.integration;

import java.net.HttpURLConnection;
import java.net.ProtocolException;

import com.thetransactioncompany.jsonrpc2.client.ConnectionConfigurator;


public class BasicAuth implements ConnectionConfigurator {

    public void configure(HttpURLConnection conn) {

        conn.setRequestProperty("Host","online.sbis.ru");
        conn.setRequestProperty("Content-Type", "application/json");
        conn.setRequestProperty( "charset", "windows-1251");
        conn.setRequestProperty("Content-Length", "179");
        try {
            conn.setRequestMethod("POST");
        } catch (ProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        conn.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");

    }
}
然后我设法读取数据。有关详情,请查看here。只是添加我的原始代码工作正常。之后。非常有趣!

无论如何,感谢所有想要帮助的人。谢谢。