Я вкладываю много времени в правильное понимание компонентов архитектуры и того, как все вписывается в шаблон MVVM. Итак, вот как я вижу вещи (не делая инъекцию Кинжала, поскольку я еще не получил это далеко):
a) UserEntity
- это класс с аннотацией @Entity
для обработки создания таблицы Room
@Entity(tableName="users")
public class Users{
private long id;
private String name;
}
b) User
класс pojo в модели, чтобы использовать его вокруг приложения и при необходимости иметь дополнительные поля.
public class User{
private long id;
private String name;
private List<Role> roles;
private Preferences preferences;
}
помимо этого могут быть разные pojos в зависимости от того, что мне нужно от db, например, UserWithRoles
c) UserDao
заботится о получении или вставке / обновлении информации в базе данных комнаты. Здесь для @Insert
, @Update
я могу использовать UserEntity
, но для @Query
я также могу использовать классы pojo
@Dao
public abstract class UserDao{
@Insert
public abstract long insertUser(User user)
@Query("Select someFields from inner joined tables")
public abstract LiveData<List<UserRoles> getUsersWithRoles();
}
d) Иметь RepositoryUser
в качестве хранилища между ViewModel и Dao
public class RepositoryUser{
private UserDao userDao;
public RepositoryUser(Application app){
Database db = Databaase.getDatabase(app.getApplicationContext);
userDao = db.userDao();
}
public LiveData<List<UserWithRoles>> getUsersWithRoles(){
return userDao.getUsersWithRoles()
}
}
e) UserWithRolesViewModel
будет доступно для фрагмента, который показывает список с пользователями и их ролями
public class UserWithRolesViewModel extends AndroidViewModel{
private RepositoryUser repositoryUser;
public UserWithRolesViewModel(Application app){
super(app);
repositoryUser = new RepositoryUser(app);
}
public LiveData<List<UserWithRoles>> getUsersWithRoles(){
return repositoryUser.getUsersWithRoles()
}
}
f) В своем фрагменте я могу сделать что-то вроде:
public void onCreate(...){
viewModel = ViewModelProviders.of(this).get(UserWithRolesViewModel.class);
}
public View onCreateView(...){
viewModel.getUsersWithRoles().observe(...)
public void onChanged(...){
adapter.setData(...);
}
}
Однако, некоторые части отсутствуют. Насколько я понимаю, согласно MVVM представление должно отвечать только за отображение информации, поэтому внутри фрагмента или действия не должно быть никакой реальной логики или даже обработки. На данный момент у меня есть 2 вопроса:
- По обычной схеме я бы создал интерфейс, например
onFragmentAction
, и реализовал его в activity
. Затем в fragment
, когда я хотел сообщить действиям что-то сделать, я бы сделал callback.onFragmentAction(params)
, и onFragmentAction
в действии сработал бы и действовал бы соответственно Как этот сценарий обрабатывается в MVVM? Как фрагмент говорит с его родительской активностью?
- По обычному принципу, который я бы использовал внутри фрагмента
onCreateView
, накачайте макет, используйте findViewById
, чтобы получить представления и используйте, например, textView.setText () или button.setOnClickListener (). Как это можно сделать в MVVM? Использовать DataBinding?