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

如何按登录邮箱查询SQLite用户数据并在MainActivity展示

实现步骤

1. 先配置MainActivity布局

在activity_main.xml中添加对应的数据展示控件,基础示例如下:

<!-- 用户头像 -->
<ImageView
    android:id="@+id/iv_avatar"
    android:layout_width="80dp"
    android:layout_height="80dp"
    android:scaleType="centerCrop"/>
<!-- 用户姓名 -->
<TextView
    android:id="@+id/tv_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="18sp"/>
<!-- 用户邮箱 -->
<TextView
    android:id="@+id/tv_email"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
<!-- 用户性别 -->
<TextView
    android:id="@+id/tv_gender"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
<!-- 用户状态 -->
<TextView
    android:id="@+id/tv_status"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

2. 编写MainActivity数据加载逻辑

注意:数据库读写操作不能直接在主线程执行,否则会触发ANR崩溃,Java环境下用子线程查询+Handler切回主线程更新UI即可,完整参考代码:

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    private DBHandler dbHandler;
    private ImageView ivAvatar;
    private TextView tvName, tvEmail, tvGender, tvStatus;
    private final Handler mainHandler = new Handler(Looper.getMainLooper());

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

        // 初始化页面控件
        ivAvatar = findViewById(R.id.iv_avatar);
        tvName = findViewById(R.id.tv_name);
        tvEmail = findViewById(R.id.tv_email);
        tvGender = findViewById(R.id.tv_gender);
        tvStatus = findViewById(R.id.tv_status);

        dbHandler = new DBHandler(this);
        // 替换成你自己的登录态获取逻辑,拿到当前登录用户的邮箱即可
        String currentUserEmail = getSharedPreferences("login_config", MODE_PRIVATE)
                .getString("current_login_email", "");

        // 开子线程执行数据库查询
        new Thread(() -> {
            ArrayList<User> userList = dbHandler.getUserData(currentUserEmail);
            // 切回主线程更新UI
            mainHandler.post(() -> {
                if (userList == null || userList.isEmpty()) {
                    Toast.makeText(MainActivity.this, "未查询到当前用户数据", Toast.LENGTH_SHORT).show();
                    return;
                }
                // 邮箱是唯一校验字段,查询结果只会有1条数据,直接取第一个元素即可
                User currentUser = userList.get(0);
                // 填充文本类数据
                tvName.setText(currentUser.getFirstName() + " " + currentUser.getLastName());
                tvEmail.setText(currentUser.getEmail());
                tvGender.setText(currentUser.getGender());
                tvStatus.setText(currentUser.getStatus());
                // 将字节数组转为Bitmap填充头像
                byte[] avatarBytes = currentUser.getImage();
                if (avatarBytes != null && avatarBytes.length > 0) {
                    Bitmap avatarBitmap = BitmapFactory.decodeByteArray(avatarBytes, 0, avatarBytes.length);
                    ivAvatar.setImageBitmap(avatarBitmap);
                }
            });
        }).start();
    }
}

3. 避坑提示

  • 确认你的User实体类有对应字段的getter方法,如果属性是public修饰的,直接通过属性名取值也可以。
  • 你当前的查询逻辑用硬编码列索引取值,要确保建表时的列顺序和索引完全对应,更稳妥的写法是通过列名拿索引,比如cursor.getString(cursor.getColumnIndex(COLUMN_FIRST_NAME)),后续调整表结构时不会出现取错字段的问题。
  • 页面销毁时记得关闭数据库连接,避免内存泄漏。

内容的提问来源于stack exchange,提问作者Mehmood Ur Rehman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.19 16:15:46