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

Android登录后从SQLite查询用户数据并显示至TextView的实现方法

解决方案:查询登录用户信息并展示到Dashboard

嘿,兄弟,看你有Android开发经验但SQLite这块不太熟,我来帮你捋捋怎么实现查询登录用户信息并展示到Dashboard的TextView里~首先得先修正你现有代码里的几个问题,再一步步实现正确的逻辑:

先说说你现有getData方法的问题

  • 方法返回类型是String,但你实际想返回User对象,类型完全不匹配,编译肯定报错
  • SQL语句直接拼接邮箱参数,存在SQL注入风险,这是SQL操作的大忌
  • 循环里重复创建User对象,而且循环外没有定义response变量,最后return response会报未定义错误
  • 查询完成后没有关闭Cursor和SQLiteDatabase,容易造成内存泄漏

正确的实现步骤

1. 修改SQLiteHelper中的查询方法

我们把方法改成根据邮箱查询并返回User对象,用参数化查询避免注入,同时正确处理资源关闭:

public class SQLiteHelper extends SQLiteOpenHelper {
    // 这里假设你已经定义了表名和列名常量,比如:
    private static final String TABLE_USERS = "users";
    private static final String COLUMN_ID = "id";
    private static final String COLUMN_NAME = "name";
    private static final String COLUMN_USERNAME = "username";
    private static final String COLUMN_EMAIL = "email";
    private static final String COLUMN_AGE = "age";
    private static final String COLUMN_AMOUNT = "amount";
    private static final String COLUMN_PASSWORD = "password";

    // 构造方法等其他代码...

    // 新增:根据邮箱查询用户的方法
    public User getUserByEmail(String email) {
        User user = null;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = null;

        try {
            // 参数化查询,用?占位符,避免SQL注入
            String query = "SELECT * FROM " + TABLE_USERS + " WHERE " + COLUMN_EMAIL + " = ?";
            cursor = db.rawQuery(query, new String[]{email});

            // 如果查到数据,解析成User对象
            if (cursor != null && cursor.moveToFirst()) {
                int id = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_ID));
                String name = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_NAME));
                String username = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_USERNAME));
                String age = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_AGE));
                String amount = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_AMOUNT));
                String password = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_PASSWORD));

                user = new User(id, name, username, email, age, amount, password);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 一定要关闭Cursor和Database,释放资源
            if (cursor != null) {
                cursor.close();
            }
            db.close();
        }

        return user;
    }
}

2. 在Dashboard Activity中接收邮箱并展示数据

在Dashboard的onCreate方法里,先获取Intent传递的邮箱,然后调用上面的方法获取用户信息,最后把数据设置到对应的TextView:

public class DashboardActivity extends AppCompatActivity {
    private TextView tvName, tvUsername, tvAge, tvAmount;
    private SQLiteHelper dbHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dashboard);

        // 初始化TextView
        tvName = findViewById(R.id.tv_name);
        tvUsername = findViewById(R.id.tv_username);
        tvAge = findViewById(R.id.tv_age);
        tvAmount = findViewById(R.id.tv_amount);

        // 获取登录页面传递的邮箱
        String userEmail = getIntent().getStringExtra("USER_EMAIL");
        if (userEmail == null || userEmail.isEmpty()) {
            // 处理邮箱为空的情况,比如跳转回登录页
            Toast.makeText(this, "登录信息异常", Toast.LENGTH_SHORT).show();
            finish();
            return;
        }

        // 初始化数据库帮助类
        dbHelper = new SQLiteHelper(this);

        // 查询用户信息
        User loggedInUser = dbHelper.getUserByEmail(userEmail);
        if (loggedInUser != null) {
            // 设置数据到TextView
            tvName.setText(loggedInUser.getName());
            tvUsername.setText(loggedInUser.getUsername());
            tvAge.setText(loggedInUser.getAge());
            tvAmount.setText(loggedInUser.getAmount());
        } else {
            Toast.makeText(this, "未找到用户信息", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 关闭数据库连接,避免内存泄漏
        if (dbHelper != null) {
            dbHelper.close();
        }
    }
}

3. 登录页面传递邮箱的注意点

确保你在登录成功后,用Intent传递邮箱时的key和Dashboard里接收的一致,比如:

// 登录成功后的代码示例
Intent intent = new Intent(LoginActivity.this, DashboardActivity.class);
intent.putExtra("USER_EMAIL", userEmail); // 这里的key要和Dashboard里的对应
startActivity(intent);
finish();

几个关键注意事项

  • 参数化查询:永远不要直接拼接SQL语句的参数,用?占位符+参数数组的方式,防止SQL注入攻击
  • 资源关闭:Cursor和SQLiteDatabase使用完一定要关闭,否则会导致内存泄漏
  • 空值判断:获取Intent传递的数据、查询用户结果时都要做空值判断,避免空指针异常

内容的提问来源于stack exchange,提问作者winfred adrah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:51:17