如何知道Firebase中是否有任何获取的数据?

时间:2019-06-12 02:01:46

标签: java android firebase firebase-realtime-database

我正在尝试查找是否有办法知道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();
    }
};

吸气剂始终为“否”。

4 个答案:

答案 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 以获得更好的理解。