使用 room 和 MVVM 对 sqlite 登录进行故障排除
Troubleshooting sqlite login using room and MVVM
我正在尝试使用 android 应用程序内的 room/sqlite 从用户详细信息存储在云中的外部登录设置切换到本地登录。
需要一些帮助来使代码与 MVVM 一起工作。它给了我一个空指针错误,我将在下面的代码片段中指出。
房间/数据库
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);
}
视图模型
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 public void onChanged(UsersTable usersTable)
上面观察者方法中的 UsersTable 显示为空。我不太确定我是否采取了正确的方法来检查他们输入的用户登录详细信息是否与数据库中的相匹配?如有任何建议或帮助,我们将不胜感激。
我通过简单地执行标准读取数据库中的所有行并使用实时数据将数据作为列表返回到 activity 自己解决了这个问题。从那里我做了一个 for 循环来遍历列表并使用 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();
}
}
}
});
我正在尝试使用 android 应用程序内的 room/sqlite 从用户详细信息存储在云中的外部登录设置切换到本地登录。
需要一些帮助来使代码与 MVVM 一起工作。它给了我一个空指针错误,我将在下面的代码片段中指出。
房间/数据库
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);
}
视图模型
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 public void onChanged(UsersTable usersTable)
上面观察者方法中的 UsersTable 显示为空。我不太确定我是否采取了正确的方法来检查他们输入的用户登录详细信息是否与数据库中的相匹配?如有任何建议或帮助,我们将不胜感激。
我通过简单地执行标准读取数据库中的所有行并使用实时数据将数据作为列表返回到 activity 自己解决了这个问题。从那里我做了一个 for 循环来遍历列表并使用 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();
}
}
}
});