首页 > 解决方案 > 在android中使用firebase身份验证插入和检索登录用户的数据

问题描述

我使用 Firebase 身份验证来使用电子邮件和密码注册和登录用户。在我的应用程序中,用户正在保存联系信息。现在我希望特定登录用户输入的数据(如姓名和号码)只应显示在他们的应用程序中。目前,我的应用程序在回收站视图中显示所有联系信息,但我希望只有当前登录用户输入的数据应该可见。这是用于注册的firebase身份验证代码。

  mAuth.createUserWithEmailAndPassword(email, password)
                .addOnCompleteListener(MainActivity.this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful())
                        {
                            bar.setVisibility(View.INVISIBLE);
                            t1.getEditText().setText("");
                            t2.getEditText().setText("");
                            Toast.makeText(getApplicationContext(),"Registered Successfully",Toast.LENGTH_LONG).show();
                        }
                        else
                        {
                            bar.setVisibility(View.INVISIBLE);
                            t1.getEditText().setText("");
                            t2.getEditText().setText("");
                            Toast.makeText(getApplicationContext(),"Process Error",Toast.LENGTH_LONG).show();
                        }
                    }
                });

这是我插入联系信息的代码

private void processinsert()
    {
        Map<String,Object> map=new HashMap<>();
        map.put("name",name.getText().toString());
        map.put("number",course.getText().toString());
        map.put("email",email.getText().toString());
       
        FirebaseDatabase.getInstance().getReference().child("contacts").push()
                .setValue(map)
                .addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                       name.setText("");
                       number.setText("");
                       email.setText("");
                      
                        Toast.makeText(getApplicationContext(),"Inserted Successfully",Toast.LENGTH_LONG).show();
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e)
                    {
                        Toast.makeText(getApplicationContext(),"Could not insert",Toast.LENGTH_LONG).show();
                    }
                });

这是在回收器视图中显示数据的适配器的代码。

public class myadapter extends FirebaseRecyclerAdapter<model,myadapter.myviewholder> {
    public myadapter(@NonNull FirebaseRecyclerOptions<model> options) {
        super(options);
    }

    @Override
    protected void onBindViewHolder(@NonNull final myviewholder holder, final int position, @NonNull final model model) {
       holder.name.setText(model.getName());
       holder.number.setText(model.getNumber());
       holder.email.setText(model.getEmail());
       
        holder.edit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final DialogPlus dialogPlus=DialogPlus.newDialog(holder.img.getContext())
                        .setContentHolder(new ViewHolder(R.layout.dialogcontent))
                        .setExpanded(true,800)
                        .create();
                View myview=dialogPlus.getHolderView();
                
                final EditText name=myview.findViewById(R.id.uName);
                final EditText number=myview.findViewById(R.id.uNumber);
                final EditText email=myview.findViewById(R.id.uEmail);
                Button submit=myview.findViewById(R.id.submit);
               
                name.setText(model.getName());
                number.setText(model.getNumber());
              email.setText(model.getEmail());

                dialogPlus.show();
                submit.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Map<String,Object> map=new HashMap<>();
                        
                        map.put("name",name.getText().toString());
                        map.put("number",number.getText().toString());
                        map.put("email",email.getText().toString());
                        FirebaseDatabase .getInstance().getReference()
                                .child("contacts").child(getRef(position).getKey()).updateChildren(map)
                                .addOnSuccessListener(new OnSuccessListener<Void>() {
                                    @Override
                                    public void onSuccess(Void aVoid) {
                                        dialogPlus.dismiss();
                                    }
                                }).addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                              dialogPlus.dismiss();
                            }
                        });
                    }
                });
            }
        });

        holder.delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AlertDialog.Builder builder=new AlertDialog.Builder();
                builder.setTitle("Delete Panel");
                builder.setMessage("Delete....?");
                builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        FirebaseDatabase .getInstance().getReference()
                                .child("contacts").child(getRef(position).getKey()).removeValue();
                    }
                });
                builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                    }
                });
                builder.show();
            }
        });
    }

    @NonNull
    @Override
    public myviewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
       View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.singlerow,parent,false);
       return new myviewholder(view);
    }

    class myviewholder extends RecyclerView.ViewHolder
    {
        
        TextView name,number,email;
        ImageView edit,delete;

        public myviewholder(@NonNull View itemView) {
            super(itemView);

           
            name=(TextView)itemView.findViewById(R.id.nametext);
            number=(TextView)itemView.findViewById(R.id.numbertext);
            email=(TextView)itemView.findViewById(R.id.emailtext);
            edit=(ImageView)itemView.findViewById(R.id.edit);
            delete=(ImageView)itemView.findViewById(R.id.delete);
        }
    }
}

显示回收器视图的 MainActiviting 代码是:

FirebaseRecyclerOptions<model> options=
                new FirebaseRecyclerOptions.Builder<model>()
                .setQuery(FirebaseDatabase.getInstance().getReference().child("contacts"),model.class)
                .build();

        myadapter=new myadapter(options);
        recyclerView.setAdapter(myadapter);

我读到,通过在树中插入当前登录的用户 ID,我们可以通过比较当前登录用户的用户 ID 和保存在树中的用户 ID 来访问当前登录用户的数据。但我不知道该怎么做。请指导我应该在树中的何处插入当前登录用户的 user_id 以及如何在该特定用户登录时检索数据。数据库结构附在下面。 在此处输入图像描述

标签: androiddatabasefirebase-realtime-databaseandroid-recyclerviewfirebase-authentication

解决方案


所以你想检索当前的用户数据,比如个人资料之类的?您可以使用共享首选项来做到这一点。首先,新建一个Java类SessionManager.java

public class SessionManager {

    SharedPreferences userSessions;
    SharedPreferences.Editor editor;
    Context context;

    private static final String IS_LOGIN = "IsLoggedIn";
    public static final String KEY_NAME = "name";
    public static final String KEY_NUMBER= "number";
    public static final String KEY_EMAIL = "email";

    public SessionManager(Context _context) {
        context = _context;
        userSessions = _context.getSharedPreferences("userLoginSession", Context.MODE_PRIVATE);
        editor = userSessions.edit();
    }

    public void createLoginSession(String name, String number, String email) {    
        editor.putBoolean(IS_LOGIN, true);    
        editor.putString(KEY_NAME, name);
        editor.putString(KEY_NUMBER, number);
        editor.putString(KEY_EMAIL, email);   
        editor.commit();
    }

    public HashMap<String, String> getUsersDetailFromSession() {
        HashMap<String, String> userData = new HashMap<String, String>();
        userData.put(KEY_FULLNAME, userSessions.getString(KEY_NAME, null));
        userData.put(KEY_EMAIL, userSessions.getString(KEY_NUMBER, null));
        userData.put(KEY_EMAIL, userSessions.getString(KEY_EMAIL, null));    
        return userData;
    }

    public boolean checkLogin() {
        if (userSessions.getBoolean(IS_LOGIN, false)) {
            return true;
        } else {
            return false;
        }
    }

    public void logoutUserSession() {
        editor.clear();
        editor.commit();
    }

}

然后在插入数据时使用此代码,将当前用户数据保存到 Shared Preferences:

SessionManager sessionManager = new SessionManager(getApplicationContext());
sessionManager.createLoginSession(name, number, email);

使用此代码检索数据,您可以将其放入 String 变量:

SessionManager sessionManager = new MySharedPreferences(getApplicationContext());
HashMap<String, String> hashMap = sessionManager.getUsersDetailFromSession();
String name = hashMap.get(SessionManager.KEY_NAME);
String number = hashMap.get(SessionManager.KEY_NUMBER);
String email = hashMap.get(SessionManager.KEY_EMAIL);

如果要注销或清除 SharedPreferences,请不要忘记调用logoutUserSession()方法

您也可以通过使用checkLogin()方法检查登录状态


推荐阅读