Как сопоставить значения в разных таблицах в SQLite? - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь создать функцию базы данных, которая поможет мне сопоставить идентификатор моего студента.В table_userinfo уже хранятся идентификатор студента, имя и значения курса.table_users пуст, который принимает электронную почту, идентификатор студента и пароль от пользователя.Я хочу создать функцию, в которой может регистрироваться только идентификатор студента, хранящийся в table_userinfo, в противном случае выдается сообщение об ошибке, что студент не существует.Идентификатор студента, введенный пользователем, должен также извлечь соответствующий курс и имя из table_userinfo.Также мой код для вставки значений правильно или нет.Поскольку я попробовал это прежде, и я получил ошибку запуска в первой строке значения вставки.

//Code for table creation
 public static final String SQL_TABLE_USERS = " CREATE TABLE " +    
TABLE_USERS
         + " ( "
         + KEY_ID + " INTEGER PRIMARY KEY, "
         + KEY_EMAIL + " TEXT, "
         + KEY_SID + " INTEGER, "
         + KEY_PASSWORD + " TEXT"
         + " ) ";

 //SQL for creating user info table
 public static final String SQL_TABLE_USERINFO = " CREATE TABLE "    
+ TABLE_USERINFO
         + " ( "
         + KEY_ID + "INTEGER PRIMARY KEY, "
         + KEY_SID + " INTEGER, "
         + KEY_NAME + "TEXT, "
         + KEY_COURSE + " TEXT "
         + " ) ";


 public SqliteHelper(Context context) {
     super(context, DATABASE_NAME, null, DATABASE_VERSION);
 }

 @Override
 public void onCreate(SQLiteDatabase sqLiteDatabase) {
     //Create Table when oncreate gets called
     sqLiteDatabase.execSQL(SQL_TABLE_USERS);
     sqLiteDatabase.execSQL(SQL_TABLE_USERINFO);
     sqLiteDatabase.execSQL("INSERT INTO TABLE_USERINFO 
   VALUES('01','45207160010','Mary James','TYBSCIT')");
     sqLiteDatabase.execSQL("INSERT INTO TABLE_USERINFO 
  VALUES('02','45207160020','Amelia John','FYBCOM')");

ОБНОВЛЕНИЕ: - Теперь у меня есть две функции для проверки, существует ли электронная почта и есть ли студент в моем sqlite-коде.Но когда я вызываю функции со страницы реестра, приложение вылетает, и в журнале говорится, что ошибка возникает при нажатии кнопки регистрации.Я делюсь кодом своих функций и страницей регистрации.Пожалуйста, скажите мне, если я делаю какую-то ошибку.Я уже пробовал разные комбинации для циклов на моей странице регистрации.Не работаетОднако если поставить только функцию «Электронная почта существует», она будет работать.

Код SQLITE

 public boolean ifUserInCourse(String sid) {
        boolean rv = false;
        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.getCount() > 0) rv = true;
        csr.close();
        return rv;
    }


    public boolean isEmailExists(String email) {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.query(TABLE_USERS,// Selecting Table
                new String[]{KEY_ID, KEY_EMAIL, KEY_SID, KEY_PASSWORD},//Selecting columns want to query
                KEY_EMAIL + "=?",
                new String[]{email},//Where clause
                null, null, null);

        if (cursor != null && cursor.moveToFirst()&& cursor.getCount()>0) {
            //if cursor has value then in user database there is user associated with this given email so return true
            return true;
        }

        //if email does not exist return false
        return false;
    }

Регистрационный код

buttonRegister.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (validate()) {
                    String Email = editTextEmail.getText().toString();
                    String SID = editTextSID.getText().toString();
                    String Password = editTextPassword.getText().toString();
                    progressBar.setVisibility(View.VISIBLE);

                    //Check in the database is there any user associated with  this email

                        if (!sqliteHelper.ifUserInCourse(SID) && !sqliteHelper.isEmailExists(Email)) {

                            sqliteHelper.addUser(new User(null, Email, SID, Password));
                            Snackbar.make(buttonRegister, "User created successfully! Please Login ", Snackbar.LENGTH_LONG).show();
                            new Handler().postDelayed(new Runnable() {
                                @Override
                                public void run() {
                                    finish();
                                }
                            }, Snackbar.LENGTH_LONG);


                        } else {
                            if(sqliteHelper.isEmailExists(Email)) {

                                Snackbar.make(buttonRegister, "Email already exists ", Snackbar.LENGTH_LONG).show();


                            } else {

                                Snackbar.make(buttonRegister, "User doesn't exists ", Snackbar.LENGTH_LONG).show();
                            }

                        }

                    progressBar.setVisibility(View.GONE);


                }
            }
        });

1 Ответ

0 голосов
/ 05 февраля 2019

Выпуск 1 согласно: -

Также мой код для вставки значений правильно или нет.Поскольку я пробовал это раньше, и я получил ошибку запуска в первой строке значения вставки.

Если у вас нет public static final String TABLE_USERINFO = "TABLE_USERINFO";, который рассматривает вопрос, почти совпадающий с дубликатом вопроса, вы не получите

    sqLiteDatabase.execSQL("INSERT INTO TABLE_USERINFO VALUES('01','45207160010','Mary James','TYBSCIT')");
    sqLiteDatabase.execSQL("INSERT INTO TABLE_USERINFO VALUES('02','45207160020','Amelia John','FYBCOM')");

В результате возникнет исключение из-за того, что таблица не найдена.

Я считаю, что вместо этого вам следует использовать: -

    sqLiteDatabase.execSQL("INSERT INTO " + TABLE_USERINFO + " VALUES('01','45207160010','Mary James','TYBSCIT')");
    sqLiteDatabase.execSQL("INSERT INTO " + TABLE_USERINFO + " VALUES('02','45207160020','Amelia John','FYBCOM')");
  • т.е. использовать пользовательскую переменнуюTABLE_USERINFO, а не жестко закодированное значение TABLE_USERINFO.

Кроме того, вы столкнетесь с проблемами, поскольку у вас есть + KEY_NAME + "TEXT, " вместо + KEY_NAME + " TEXT, " (пробел пропущен).

Проблема 2 согласно:-

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

Следующее SqliteHelper.java облегчит вышеуказанное ( с учетом вашегоответ на ранее предоставленный ответ на аналогичный вопрос )

public class SqliteHelper extends SQLiteOpenHelper {

    public static final String DATABASE_NAME = "mydb";
    public static final int DATABASE_VERSION = 1;

    public static final String TABLE_USERS = "user_reg";
    public static final String TABLE_USERINFO = "user_info";

    public static final String KEY_ID = BaseColumns._ID;
    public static final String KEY_EMAIL = "email";
    public static final String KEY_SID = "sid";
    public static final String KEY_PASSWORD = "password";
    public static final String KEY_NAME = "name";
    public static final String KEY_COURSE = "coures";



    public static final String SQL_TABLE_USERS = " CREATE TABLE " +
            TABLE_USERS
            + " ( "
            + KEY_ID + " INTEGER PRIMARY KEY, "
            + KEY_EMAIL + " TEXT, "
            + KEY_SID + " INTEGER, "
            + KEY_PASSWORD + " TEXT"
            + " ) ";

    //SQL for creating user info table
    public static final String SQL_TABLE_USERINFO = " CREATE TABLE "
            + TABLE_USERINFO
            + " ( "
            + KEY_ID + "INTEGER PRIMARY KEY, "
            + KEY_SID + " INTEGER, "
            + KEY_NAME + " TEXT, "
            + KEY_COURSE + " TEXT "
            + " ) ";

    public SqliteHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        //Create Table when oncreate gets called
        sqLiteDatabase.execSQL(SQL_TABLE_USERS);
        sqLiteDatabase.execSQL(SQL_TABLE_USERINFO);
        sqLiteDatabase.execSQL("INSERT INTO " + TABLE_USERINFO + " VALUES('01','45207160010','Mary James','TYBSCIT')");
        sqLiteDatabase.execSQL("INSERT INTO " + TABLE_USERINFO + " VALUES('02','45207160020','Amelia John','FYBCOM')");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

    public long registerUser(String sid, String email, String password) {
        if (email.length() < 1) return -9999;
        if (password.length() < 1) return -9998;
        if (sid.length() < 1) return -9997;
        if (ifUserRegistered(sid)) return -99; // Check if user is already registered
        if (!ifUserInCourse(sid)) return  -999;  // Check if user is enrolled in a course perhpas optional
        ContentValues cv = new ContentValues();
        cv.put(KEY_SID,sid);
        cv.put(KEY_EMAIL,email);
        cv.put(KEY_PASSWORD,password);
        SQLiteDatabase db = this.getWritableDatabase();
        return db.insert(TABLE_USERS,null,cv);
    }

    public boolean ifUserRegistered(String sid) {
        boolean rv = false;
        String whereclause = KEY_SID + "=?";
        String[] whereargs = new String[]{sid};
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor csr = db.query(TABLE_USERS,null,whereclause,whereargs,null,null,null);
        if (csr.getCount() > 0) rv = true;
        csr.close();
        return rv;
    }

    public boolean ifUserInCourse(String sid) {
        boolean rv = false;
        String whereclause = KEY_SID + "=?";
        String[] whereargs = new String[]{sid};
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor csr = db.query(TABLE_USERINFO,null,whereclause,whereargs,null,null,null);
        if (csr.getCount() > 0) rv = true;
        csr.close();
        return rv;
    }

    public String getUserNameFromSID(String sid) {
        String rv = "";
        String whereclause = KEY_SID + "=?";
        String[] whereargs = new String[]{sid};
        SQLiteDatabase db = this.getWritableDatabase();
        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;
    }

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

Тестирование

Выше было проверено использование следующего кода в задании: -

public class MainActivity extends AppCompatActivity {

    SqliteHelper mSQLHlpr;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSQLHlpr = new SqliteHelper(this);
        long result1 = mSQLHlpr.registerUser("010101010101010101","blah@mail.com","1234567890");
        long result2 = mSQLHlpr.registerUser("45207160010","xxxx@mail.com","1234567890");
        long result3 = mSQLHlpr.registerUser("45207160010","yyyy@mail.com","1234567890");


        Log.d(
                "RESULTS",
                "\tFirst attempt returned " + String.valueOf(result1) + " " + String.valueOf((result1 > 0)) +
                        "\n\tSecond attempt returned " + String.valueOf(result2) + " " + String.valueOf(result2 > 0) +
                        "\n\tThird attempt returned " + String.valueOf(result3) + " " + String.valueOf(result3 > 0)
        );

        String testsid = "45207160010";

        Log.d(
                "USERBYSID",
                "SID " + testsid + " " +
                        "Has a name of " + mSQLHlpr.getUserNameFromSID(testsid) +
                        " and a Course of " + mSQLHlpr.getUserNameFromSID(testsid)
        );
    }
}
  • Примечание Вышеуказанное использовалось для целей тестирования, оно не предназначено для реального приложения, поскольку в этом случае результаты могут быть запутанными из-за уже существующих строк.

Результат

Выше был получен следующий соответствующий вывод: -

2019-02-05 12:38:08.684 21533-21533/? D/RESULTS:    First attempt returned -999 false
        Second attempt returned 1 true
        Third attempt returned -99 false
2019-02-05 12:38:08.686 21533-21533/? D/USERBYSID: SID 45207160010 Has a name of Mary James and a Course of Mary James
  • -999 - это код для SID, не существующего
  • 1, положительное значение означает, чтострока была успешно вставлена ​​и, следовательно, все тесты пройдены.
  • -99 - это код уже зарегистрированного SID.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...