Как получить информацию о пользователе из базы данных SQLite, имеющей две таблицы? - PullRequest
0 голосов
/ 07 февраля 2019

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

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

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 голосов
/ 07 февраля 2019

Вы можете использовать JOIN , (я полагаю из предыдущих вопросов, что SID есть в обеих таблицах, так что это то, что вы использовали бы в качестве основы для JOIN ).

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

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...