You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio App多用户存储问题:仅保留最后一个用户数据

解决SharedPreferences仅保留最后一个用户的问题

我懂你的烦恼——每次注册新用户后,之前的账号就凭空消失了,只能用最后一个用户登录对吧?这问题出在你当前的存储逻辑上:你应该是用固定的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:15:32