从Firebase实时数据库中获取并比较键和值

时间:2018-10-14 17:36:25

标签: android firebase firebase-realtime-database

我正在尝试制作一个用于用户存储其数据的应用程序。我使用了用户共享首选项来保存用户登录详细信息,但出于安全目的,我进行了一项活动(验证密码活动),要求用户密码允许访问数据。现在,我可以保存,获取和删除数据。但是在我的验证密码活动中,我只想获取存储密码的特定键和值。我不想在“验证密码活动”中获取完整的数据。

下面是我用来将密码保存到数据库的代码:-

databaseReference.child(uniqueID).setValue(passcode);

以下是我尝试仅获取密码的代码:-

dbreference.child(uniqueID).orderByChild("passcode").equalTo(pass).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()){
            Toast.makeText(getApplicationContext(), "Data exist", Toast.LENGTH_LONG).show();
        }else{
            Toast.makeText(getApplicationContext(), "Data doesn't exist", Toast.LENGTH_LONG).show();
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

    }
});

这里uniqueID"abhishek88666kumar",而pass是用于getText()的变量。

这是我的Firebase数据库的屏幕截图:-

Database Screenshot

这是验证密码活动屏幕截图:-

Verify Passcode Activity Screenshot

请查看数据库截图并验证密码活动截图。

议程:

  1. getText()来自活动内部的textView。

  2. 从Firebase实时数据库中获取
  3. getValue(仅适用于当前用户。在我们的情况下为'abhishek88666kumar')。

  4. 比较1和2是否相同。 (如果相同,则重定向到MainActivity,否则显示错误。)

请告诉我我做错了。

3 个答案:

答案 0 :(得分:0)

假设pass是类似于1234的值,则此行:

dbreference.child(uniqueID).orderByChild("passcode").equalTo(pass).addListenerForSingleValueEvent(...

应该是:

FirebaseDatabase.getInstance().getReference("passcodes").orderByValue().equalTo(pass).addListenerForSingleValueEvent(...

这样,DataSnapshot将包含passcodes的所有子节点,它们的值均为1234,即JSON示例中的"abhishek88666kumar"

还请务必研究documentation on sorting and filtering data

答案 1 :(得分:0)

  

这是比较Firebase数据的第一种方法。

btnSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                passcode = editText.getText().toString();

                Toast.makeText(getApplicationContext(), "Data :"+passcode, Toast.LENGTH_LONG).show();

                DatabaseReference ref = FirebaseDatabase.getInstance().getReference("passcode");
               Query applesQuery = ref.orderByValue().equalTo(passcode);

                applesQuery.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {


                        if (dataSnapshot.exists()){

                            Toast.makeText(getApplicationContext(), "Data exist", Toast.LENGTH_LONG).show();
                        }else{
                            Toast.makeText(getApplicationContext(), "Data doesn't exist"+passcode, Toast.LENGTH_LONG).show();
                        }
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {
                        // Log.e(TAG, "onCancelled", databaseError.toException());
                    }
                });

            }
        });
  

这是比较Firebase数据的第二种方法。

btnSave.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            check = editText.getText().toString();

            Toast.makeText(getApplicationContext(), "Data :"+check, Toast.LENGTH_LONG).show();

            DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("passcode");
           // Query applesQuery = ref.child("Customers").orderByChild("abhishek88666kumar").equalTo(passcode);

            ref.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

                    Map<String, Object> map = (Map<String, Object>) dataSnapshot.getValue();
                    if(map.get("abhishek88666kumar")!=null){
                        passcode = map.get("abhishek88666kumar").toString();

                        if (passcode.equals(check))
                        {
                            Toast.makeText(getApplicationContext(), "Data exist", Toast.LENGTH_LONG).show();
                        }
                        else{


                            Toast.makeText(getApplicationContext(), "Data doesn't exist"+check, Toast.LENGTH_LONG).show();
                        }

                    }

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                    // Log.e(TAG, "onCancelled", databaseError.toException());
                }
            });

        }
    });

两个都在工作。 希望对您有帮助。 谢谢。

答案 2 :(得分:0)

感谢大家的帮助:)您的答案对我没有用,但是借助您的答案和我的一些知识,我自己为问题解决了。 这是符合我要求的代码。这段代码正好按照我想要的方式工作。

dbreference = FirebaseDatabase.getInstance().getReference("passcodes");
                    Query query = dbreference.orderByKey().equalTo(currentUser); //current user is "abhishek88666kumar" in this case.
                    query.addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                            if (dataSnapshot.exists()){
                                String passcode = txtPasscode.getText().toString;//Passcode is 1234 in this case.
                                String fetchedValue = "";
                                for (DataSnapshot snap : dataSnapshot.getChildren()){
                                    fetchedValue = (String) snap.getValue();
                                }
                                if (!passcode.equals(fetchedValue)){
                                    Toast.makeText(getApplicationContext(), "Passcode doesn't match.", Toast.LENGTH_LONG).show();
                                }else{
                                    Toast.makeText(getApplicationContext(), "Passcode matched.", Toast.LENGTH_LONG).show();
                                }
                            }else{
                                Toast.makeText(getApplicationContext(), "No passcode found for this user", Toast.LENGTH_LONG).show();
                            }
                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {

                        }
                    });