登出后重新登录用户信息重置问题及代码咨询
解决登出重登后JSON树属性被重置的问题
看起来你遇到的核心问题是:用户每次登出再重新登录时,数据库里的用户JSON节点被完全初始化覆盖了,导致之前的属性数据丢失对吧?这大概率是因为你在登录成功后直接执行了全节点写入操作,没有区分首次登录和再次登录的场景。
先看你提供的代码片段,我补全并调整了关键逻辑,帮你避免覆盖原有数据:
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_SIGN_IN) { IdpResponse response = IdpResponse.fromResultIntent(data); if (resultCode == RESULT_OK) { FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser(); if (firebaseUser != null) { String userId = firebaseUser.getUid(); // 这里以Realtime Database为例,Firestore逻辑类似 DatabaseReference userRef = FirebaseDatabase.getInstance().getReference("users").child(userId); // 只在用户数据不存在时才初始化,否则读取现有数据 userRef.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { if (!snapshot.exists()) { // 首次登录:初始化用户基础数据 UserModel newUser = new UserModel( firebaseUser.getDisplayName(), firebaseUser.getEmail(), "default_avatar_url" ); userRef.setValue(newUser); } else { // 再次登录:读取已有的用户数据更新UI UserModel existingUser = snapshot.getValue(UserModel.class); if (existingUser != null) { updateUserUI(existingUser); // 你自己的UI更新方法 } } } @Override public void onCancelled(@NonNull DatabaseError error) { Log.e("LoginFlow", "检查用户数据失败", error.toException()); } }); } } } }
关键思路说明
- 区分首次/再次登录:通过
snapshot.exists()判断数据库中是否已有该用户的节点,只有首次登录时才执行全量初始化写入 - 避免覆盖数据:如果直接调用
setValue()/set()会替换整个节点的所有数据,所以必须先检查存在性 - 一次性读取:用
addListenerForSingleValueEvent只读取一次节点状态,不需要持续监听,节省资源
如果你用的是Firestore,逻辑几乎一致,只是API稍有不同:
// Firestore版本的检查逻辑 FirebaseFirestore db = FirebaseFirestore.getInstance(); DocumentReference userDoc = db.collection("users").document(userId); userDoc.get().addOnCompleteListener(task -> { if (task.isSuccessful()) { DocumentSnapshot doc = task.getResult(); if (!doc.exists()) { // 首次登录初始化 UserModel newUser = new UserModel(firebaseUser.getDisplayName(), firebaseUser.getEmail(), "default_avatar"); userDoc.set(newUser); } else { // 读取现有数据 UserModel existingUser = doc.toObject(UserModel.class); updateUserUI(existingUser); } } else { Log.e("LoginFlow", "检查用户文档失败", task.getException()); } });
你可以对照自己的代码,看看是不是之前在登录成功后直接执行了写入操作,没有加存在性判断。改成上面的逻辑后,再登录就只会读取原有数据,不会重置JSON树的属性了。
内容的提问来源于stack exchange,提问作者Melo
相关产品推荐
相关产品推荐

