Android Studio App多用户存储问题:仅保留最后一个用户数据
我懂你的烦恼——每次注册新用户后,之前的账号就凭空消失了,只能用最后一个用户登录对吧?这问题出在你当前的存储逻辑上:你应该是用固定的Key把用户名和密码存在SharedPreferences里,每次新注册都会直接覆盖旧值,自然只能留下最后一条数据。
问题根源
举个直观的例子,如果你的注册代码是这么写的:
editor.putString("username", nusr.getText().toString()); editor.putString("password", nreg.getText().toString()); editor.apply();
那每次新用户注册,都会把"username"和"password"这两个Key对应的旧数据替换成新的,之前的用户信息就被彻底覆盖了。
解决方案:用JSON数组存储所有用户
我们可以把所有用户信息打包成一个JSON数组,每次注册新用户时,先把已有用户的数组读出来,添加新用户后再存回去,这样就能完整保留所有用户数据了。
步骤1:定义用户模型类
先写一个简单的用户类,用来统一管理用户名和密码:
public class User { private String username; private String password; // 构造函数 public User(String username, String password) { this.username = username; this.password = password; } // 空构造函数(Gson序列化需要) public User() {} // Getter和Setter方法 public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
步骤2:修改注册逻辑
更新注册方法,实现“读取旧列表→添加新用户→存回SharedPreferences”的流程:
private void registerNewUser(String username, String password) { // 1. 读取已有的用户列表(默认是空数组) String usersJson = shared.getString("users_list", "[]"); Gson gson = new Gson(); Type userListType = new TypeToken<ArrayList<User>>(){}.getType(); ArrayList<User> userList = gson.fromJson(usersJson, userListType); // 2. 先检查用户名是否已存在 boolean usernameExists = false; for (User user : userList) { if (user.getUsername().equals(username)) { usernameExists = true; break; } } if (usernameExists) { Toast.makeText(this, "这个用户名已经被注册啦", Toast.LENGTH_SHORT).show(); return; } // 3. 添加新用户并保存 userList.add(new User(username, password)); String updatedUsersJson = gson.toJson(userList); editor.putString("users_list", updatedUsersJson); editor.apply(); Toast.makeText(this, "注册成功!", Toast.LENGTH_SHORT).show(); }
步骤3:修改登录验证逻辑
登录时遍历用户列表,匹配输入的用户名和密码:
private boolean checkLogin(String inputUsername, String inputPassword) { String usersJson = shared.getString("users_list", "[]"); Gson gson = new Gson(); Type userListType = new TypeToken<ArrayList<User>>(){}.getType(); ArrayList<User> userList = gson.fromJson(usersJson, userListType); for (User user : userList) { if (user.getUsername().equals(inputUsername) && user.getPassword().equals(inputPassword)) { return true; // 匹配成功 } } return false; // 用户名不存在或密码错误 }
额外注意事项
- 要使用Gson处理JSON序列化,需要在Module级别的
build.gradle里添加依赖:
implementation 'com.google.code.gson:gson:2.10.1'
- 重要提醒:上面的代码是明文存储密码,这在实际项目中非常不安全!真实开发时一定要用MD5、SHA-256或者更专业的加密方式处理密码后再存储。
备选方案:用用户名作为唯一Key
如果你不想用JSON数组,也可以给每个用户的密码设置专属Key,比如用"password_" + 用户名作为Key存储密码:
// 注册逻辑 editor.putString("password_" + username, password); editor.apply(); // 登录验证逻辑 String storedPassword = shared.getString("password_" + inputUsername, null); if (storedPassword != null && storedPassword.equals(inputPassword)) { // 登录成功 } else { // 用户名不存在或密码错误 }
这种方式更简单,但如果需要获取所有用户列表就会比较麻烦,适合不需要批量管理用户的场景。
内容的提问来源于stack exchange,提问作者Luis Abraham
相关产品推荐
相关产品推荐

