具有新线程和数据绑定问题的 Room 持久库
Room persistent library with new Thread and data-binding issue
我正在研究 Android Room Persistent 库。我还在我的项目中实现了双向数据绑定。在该项目中,我通过填写表格并在行中显示所有用户并通过单击特定用户行来更新它们来插入用户。下面是我的 UserDao Class:
@Dao
public interface UserDao {
@Query("SELECT * FROM user")
List<User> getAllUsers();
@Insert
void insertAll(User... users);
@Update
void updateUser(User... users);
@Query("SELECT * FROM user WHERE user_id IN (:userId)")
User getSpecifiedUser(int...userId);
}
对于数据绑定,我在 UserFormActivity 中绑定用户模型
binding.setUserModel(userModel);
现在,由于 Room 持久库不允许您在主线程中执行任何数据库操作,为了更新用户,我通过单击新线程中的行来获取用户表单中特定用户的数据,如下所示:
private void getUserFormData(final int userId) {
try {
Thread t = new Thread(new Runnable() {
public void run() {
userModel = db.userDao().getSpecifiedUser(userId);
}
}, "Thread A");
t.start();
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
在用户模型中获取用户数据进行更新后,我希望用户数据反映在执行数据绑定的用户窗体中,但它没有反映。我被这个问题困住了。
我在我的项目中实现了 LiveData 和 ViewModel,还在我的 UserListActivity 中扩展了 LifecycleActivity。这是我的 AddUserViewModel class:
public class AddUserViewModel extends AndroidViewModel {
private UserDatabase userDatabase;
public AddUserViewModel(Application application) {
super(application);
userDatabase = UserDatabase.getDatabase(this.getApplication());
}
public void addUser(User user) {
new AddUserAsyncTask(userDatabase).execute(user);
}
private static class AddUserAsyncTask extends AsyncTask<User, Void,
Void> {
private UserDatabase db;
public AddUserAsyncTask(UserDatabase userDatabase) {
db = userDatabase;
}
@Override
protected Void doInBackground(User... params) {
db.userDao().insertUser(params);
return null;
}
}
public User getSpecificUserData(int userId) {
User user = null;
try {
user = new
getUserDataAsyncTask(userDatabase).execute(userId).get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
return user;
}
private static class getUserDataAsyncTask extends AsyncTask<Integer,
Void, User> {
private UserDatabase db;
public getUserDataAsyncTask(UserDatabase userDatabase) {
db = userDatabase;
}
@Override
protected User doInBackground(Integer... userId) {
User user = db.userDao().getSpecifiedUser(userId);
return user;
}
@Override
protected void onPostExecute(User user) {
super.onPostExecute(user);
}
}
}
在 AddUserActivity 中,我从数据库方法中获取特定的用户数据
userModel = addUserViewModel.getSpecificUserData(userId);
并在点击提交按钮时更新数据。我的 UserListActivity 扩展了 LifecycleActivity,在其中观察到用户列表,并且每当有更改时它都会更新 Use 列表,如下所示:
userViewModel = ViewModelProviders.of(this).get(UserViewModel.class);
userViewModel.getUserList().observe(UserListActivity.this, new
Observer<List<User>>() {
@Override
public void onChanged(@Nullable List<User> user) {
adapter.addItems(user);
}
});
这对我来说效果很好,我找到了解决方案!
我正在研究 Android Room Persistent 库。我还在我的项目中实现了双向数据绑定。在该项目中,我通过填写表格并在行中显示所有用户并通过单击特定用户行来更新它们来插入用户。下面是我的 UserDao Class:
@Dao
public interface UserDao {
@Query("SELECT * FROM user")
List<User> getAllUsers();
@Insert
void insertAll(User... users);
@Update
void updateUser(User... users);
@Query("SELECT * FROM user WHERE user_id IN (:userId)")
User getSpecifiedUser(int...userId);
}
对于数据绑定,我在 UserFormActivity 中绑定用户模型
binding.setUserModel(userModel);
现在,由于 Room 持久库不允许您在主线程中执行任何数据库操作,为了更新用户,我通过单击新线程中的行来获取用户表单中特定用户的数据,如下所示:
private void getUserFormData(final int userId) {
try {
Thread t = new Thread(new Runnable() {
public void run() {
userModel = db.userDao().getSpecifiedUser(userId);
}
}, "Thread A");
t.start();
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
在用户模型中获取用户数据进行更新后,我希望用户数据反映在执行数据绑定的用户窗体中,但它没有反映。我被这个问题困住了。
我在我的项目中实现了 LiveData 和 ViewModel,还在我的 UserListActivity 中扩展了 LifecycleActivity。这是我的 AddUserViewModel class:
public class AddUserViewModel extends AndroidViewModel {
private UserDatabase userDatabase;
public AddUserViewModel(Application application) {
super(application);
userDatabase = UserDatabase.getDatabase(this.getApplication());
}
public void addUser(User user) {
new AddUserAsyncTask(userDatabase).execute(user);
}
private static class AddUserAsyncTask extends AsyncTask<User, Void,
Void> {
private UserDatabase db;
public AddUserAsyncTask(UserDatabase userDatabase) {
db = userDatabase;
}
@Override
protected Void doInBackground(User... params) {
db.userDao().insertUser(params);
return null;
}
}
public User getSpecificUserData(int userId) {
User user = null;
try {
user = new
getUserDataAsyncTask(userDatabase).execute(userId).get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
return user;
}
private static class getUserDataAsyncTask extends AsyncTask<Integer,
Void, User> {
private UserDatabase db;
public getUserDataAsyncTask(UserDatabase userDatabase) {
db = userDatabase;
}
@Override
protected User doInBackground(Integer... userId) {
User user = db.userDao().getSpecifiedUser(userId);
return user;
}
@Override
protected void onPostExecute(User user) {
super.onPostExecute(user);
}
}
}
在 AddUserActivity 中,我从数据库方法中获取特定的用户数据
userModel = addUserViewModel.getSpecificUserData(userId);
并在点击提交按钮时更新数据。我的 UserListActivity 扩展了 LifecycleActivity,在其中观察到用户列表,并且每当有更改时它都会更新 Use 列表,如下所示:
userViewModel = ViewModelProviders.of(this).get(UserViewModel.class);
userViewModel.getUserList().observe(UserListActivity.this, new
Observer<List<User>>() {
@Override
public void onChanged(@Nullable List<User> user) {
adapter.addItems(user);
}
});
这对我来说效果很好,我找到了解决方案!