Как получить информацию о пользователе из базы данных SQLite с двумя таблицами?

Я пытаюсь получить информацию о пользователе в моем ящике навигации. У меня есть две разные таблицы, в одной уже сохранены имя пользователя и курс, а в другой - идентификатор и адрес электронной почты пользователя, полученные во время регистрации. Я хочу отобразить имя пользователя, идентификатор, курс и адрес электронной почты. У меня есть класс пользователя с идентификатором, адресом электронной почты и паролем для регистрации, но не с именем и курсом. Как мне получить данные из этого класса?

Приведенный ниже метод предназначен для извлечения имени пользователя из таблицы с таким же идентификатором. Я хочу отобразить это в навигационном ящике. Как я должен вызвать функцию и отобразить результат?

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;
1
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать ПРИСОЕДИНИТЬСЯ (из предыдущих вопросов я полагаю, что SID есть в обеих таблицах, поэтому вы должны использовать его в качестве основы для ПРИСОЕДИНИТЬСЯ).

Так что вы можете использовать что-то вроде SELECT * FROM userinfo JOIN userreg ON userinfo.sid = userreg.sid

  • Обратите внимание, что простое использование имени столбца sid было бы неоднозначным и, следовательно, необходимо ставить перед столбцом имя таблицы. В нынешнем виде вам придется указать столбцы sid в результате (это не должно быть проблемой, поскольку они оба будут иметь одно и то же значение, но не указание псевдонима с использованием AS cab будет проблематичным для столбцов с одинаковым именем).

Чтобы использовать удобный метод запрос, JOIN должен быть частью 1-го (табличного) параметра.

Таким образом, приведенное выше будет закодировано как: -

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;
}
  • Примечание указанное выше является в принципе кодом как таковым
    • имена переменных и идентификаторы могут не отражать фактический код и, следовательно, их необходимо изменить.
    • код не запускался и не тестировался, поэтому может содержать незначительные ошибки.
    • Вышеприведенное возвращает только имя пользователя, вы не можете вернуть несколько разных значений, поэтому вам нужно будет вернуть объект, например. Пользовательский объект, чтобы охватить несколько значений. Вы получите значения для установки объекта аналогично тому, как фургон устанавливается выше.

Дополнительный комментарий: -

The thing is, that i would need to pass the Sid parameter to the function which i can only do in the register/login page. How then can i pass this value to the navigation page?

Вместо страниц для Android используется термин «Действия». Вы можете передавать данные из одного действия в другое вызванное/запущенное/вызванное действие с помощью Intent Extras после создания экземпляра Intent при подготовке к вызову. То есть, если действие должно вызываться напрямую из родительского действия (регистрационное действие в вашем случае).

Если, например, действие регистрации было вызвано из исходного действия и возвращается из этого действия, вы все равно используете намерение для возврата значений, но действие регистрации должно быть вызвано/запущено/вызвано с помощью startActivityForResult. Действие, запускающее действие регистрации, должно переопределить метод onActivityResult. Действие регистрации устанавливает дополнительные намерения и использует setResult для указания кода результата, а затем возвращаемого намерения.

Существует множество примеров переполнения стека, например. Отправка данных обратно в основное действие в Android

Дело в том, что мне нужно будет передать параметр Sid функции, которую я могу сделать только на странице регистрации/входа. Как тогда я могу передать это значение на страницу навигации?

Prince Persia 08.02.2019 02:24

Другие вопросы по теме