首页 > 解决方案 > 如何从具有两个表的 SQLite 数据库中获取用户详细信息?

问题描述

我正在尝试在我的导航抽屉中获取用户详细信息。我有两个不同的表,一个已经存储了用户名和课程,另一个有在注册期间获取的用户的 ID 和电子邮件。我想显示用户名、ID、课程和电子邮件。我确实有一个用户类,其中包含用于注册的 ID、电子邮件和密码,但没有名称和课程。我应该如何从这个类中获取数据?

以下方法用于从具有相同 id 的表中获取用户名。我想在导航抽屉上显示这个。我应该如何调用函数并显示结果?

public String getUserNameFromSID(String sid) {
    String rv = "";
    String whereclause = KEY_SID + "=?";
    String[] whereargs = new String[]{sid};
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor csr = db.query(TABLE_USERINFO,null,whereclause,whereargs,null,null,null);
    if (csr.moveToFirst()) {
        rv = csr.getString(csr.getColumnIndex(KEY_NAME));
    }
    csr.close();
    return rv;

标签: androiddatabasesqlitefetch

解决方案


您可以使用JOIN,(我相信从之前的问题中 SID 在两个表中,所以这就是您将用作JOIN的基础)。

所以你可以使用类似的东西SELECT * FROM userinfo JOIN userreg ON userinfo.sid = userreg.sid

  • 请注意,仅使用列名 sid 会产生歧义,因此需要在列前加上表名。就目前而言,您将不得不对结果中的列进行 sid (这不应该成为问题,因为它们都是相同的值,但不使用 AS cab 指定别名对于具有相同名称的列是有问题的)。

要利用查询便利方法,JOIN 需要成为第一个(表)参数的一部分。

所以上面将被编码为: -

public String getUserNameFromSID(String sid) {
    String rv = "";
    String joinclause = " JOIN " + TABLE_USERREG + " ON " + TABLE_USERINFO + "." + KEY_SID + " = " + TABLE_USERREG + "." + KEY_SID; //<<<<<<<<<< ADDED
    String whereclause = KEY_SID + "=?";
    String[] whereargs = new String[]{sid};
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor csr = db.query(TABLE_USERINFO + joinclause,null,whereclause,whereargs,null,null,null); //<<<<<<<<<< CHANGED
    if (csr.moveToFirst()) {
        rv = csr.getString(csr.getColumnIndex(KEY_NAME));
    }
    csr.close();
    return rv;
}
  • 请注意,以上是原则上的代码
    • 变量名称和标识符可能无法反映实际代码,因此可能需要更改。
    • 该代码尚未运行或测试,因此可能包含一些小错误。
    • 上面只返回用户名,你不能返回多个不同的值,因此你需要返回一个对象,例如一个用户对象来包含多个值。您将以与上面设置rv类似的方式获取设置对象的值。

补充评论:-

问题是,我需要将 Sid 参数传递给我只能在注册/登录页面中执行的函数。那么我怎样才能将这个值传递给导航页面呢?

用于 Android 的术语不是页面,而是活动。在实例化 Intent 以准备调用之后,您可以使用 Intent Extras 将数据从一个活动传递到另一个调用/启动/调用的活动。也就是说,如果要直接从父活动(在您的情况下为注册活动)调用活动。

例如,如果从初始活动调用注册活动并从该活动返回,那么您仍然使用意图返回值,但应该使用 startActivityForResult 调用/启动/调用注册活动。启动注册活动的活动应覆盖 onActivityResult 方法。注册活动设置intent extras 并使用setResult 指示结果代码,然后返回intent。

有很多关于堆栈溢出的示例,例如将数据发送回 Android 中的主活动


推荐阅读