android - 在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 以及如何在该特定用户登录时检索数据。数据库结构附在下面。
解决方案
所以你想检索当前的用户数据,比如个人资料之类的?您可以使用共享首选项来做到这一点。首先,新建一个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()
方法检查登录状态
推荐阅读
- python - 替换字符串/句子中模式的一部分?
- wordpress - 在 WP_Query 中按帖子元排序帖子时,仅返回具有元值的帖子
- css - 缩小 MatIcon 的尺寸看起来很模糊,缩小尺寸的 SVG 看起来很完美
- node.js - SyntaxError:JSON.parse 处的 JSON 输入意外结束(
) 同时从 API 检索 json 数据 - sass - 如何在 sass 中结合两个 @for 或两个 @each(或结合两者)
- javascript - Node.js 405(方法不允许)和列不能为空 MySQL
- c++ - 无法解析对重载函数的 c++ 引用;
- java - 没有实现的接口可以在spring boot的服务类中自动装配吗
- rust - 演员&Vec
作为 &str - r - 模拟一个简单的线性模型