Устранение неполадок при входе в sqlite с использованием комнаты и MVVM - PullRequest
0 голосов
/ 25 февраля 2020

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

Нужна помощь, чтобы получить код для работа с МВВМ. Это дает мне ошибку нулевого указателя, которую я укажу в приведенных ниже фрагментах кода.

ROOM / DATABASE

public static final String DATABASE_NAME = "feelingFitDatabase";

/**
 * Singleton instance of the database.
 */
private static FeelingFitDatabase instance;

/**
 * Get MoodLogModel Access Object
 * @return
 */
public abstract MoodBeforeDao getMoodBeforeDao();

public abstract CbtDao getCbtDao();

public abstract WorkoutLogsDao getWorkoutLogsDao();

public abstract UsersDao getUsersDao();

/**
 * Creates an instance of the database.
 * @param context
 * @return
 */
public static synchronized FeelingFitDatabase getInstance(Context context) {

    if (instance == null) {
        instance = Room.databaseBuilder(
                context.getApplicationContext(),
                FeelingFitDatabase.class,
                DATABASE_NAME
        ).addMigrations(MIGRATION_20_22)
                //.fallbackToDestructiveMigration()
                .addCallback(roomCallBack)
                .build();

    }
    return instance;
}

private static RoomDatabase.Callback roomCallBack = new RoomDatabase.Callback() {
    @Override
    public void onCreate(@NonNull SupportSQLiteDatabase db) {
        super.onCreate(db);
        new PopulateDatabaseAsyncTask(instance).execute();
    }
};

DAO

 @Query("SELECT * FROM usersTable WHERE userName = :userName AND   password = :password")
 LiveData<UsersTable> verifyUserLogin(String userName, String  password);

Хранилище

 public LiveData<UsersTable> verifyUserLogin(){

    return feelingFitDatabase.getUsersDao().verifyUserLogin(userName, password);

}


VIEWMODEL

 public LiveData<UsersTable> verifyUserLogin(String userName, String password){

    return verifyUserLogin;
}

ACTIVITY

//sets onclick listener to the login button.
    btnLogin.setOnClickListener(new View.OnClickListener() {

        /**
         * @param v
         */
        @Override
        public void onClick(View v) {

            // Checks if the username and password is valid.
            if (!validateEmail() | !validatePassword()) {
                return;
            }

            stringEmail = etEmail.getText().toString();
            stringPassword = etPassword.getText().toString();

            usersViewModel.verifyUserLogin(stringEmail, stringPassword).observe(LoginActivity.this, new Observer<UsersTable>() {
                @Override
                public void onChanged(UsersTable usersTable) {

                    if (usersTable.getUserName().equals(stringEmail) && usersTable.getPassword().equals(stringPassword)) {
                        Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                        startActivity(intent);
                    }
                }
            });
        }
    });
}

Эта строка: @Override publi c void onChanged (UsersTable usersTable)

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

1 Ответ

0 голосов
/ 25 февраля 2020

Я решил эту проблему самостоятельно, просто выполнив стандартное чтение всех строк из базы данных и возвратив данные в виде списка в действие, используя живые данные. Оттуда я сделал для l oop до l oop список и использовал оператор if, чтобы проверить, совпадают ли имя пользователя и пароль.

usersViewModel.verifyUserLogin().observe(LoginActivity.this, new Observer<List<UsersTable>>() {
                @Override
                public void onChanged(List<UsersTable> usersTables) {

                    for (UsersTable ut: usersTables){

                        if (ut.getUserName().equals(stringEmail) && ut.getPassword().equals(stringPassword)) {
                            Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                            startActivity(intent);
                        } else {

                            Toast.makeText(LoginActivity.this, "Invalid username or password", Toast.LENGTH_SHORT).show();
                        }
                    }


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