如何按登录邮箱查询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
相关产品推荐
相关产品推荐

