web-dev-qa-db-fra.com

Android MVVM ViewModel et Repositories pour chaque entité?

Avec les composants Android Architecture et le modèle MVVM, j'ai une question.

Sur la base de la plupart des exemples sur le Web, il existe généralement des exemples simples.

  1. Avoir une entité pour la salle @Entity public class User{ ... }

  2. Avoir un DAO @Dao public interface UserDao{ ... }

  3. Avoir un référentiel public class UserRepository{ }

  4. ViewModel public class UsersListViewModel extends AndroidViewModel{ .... }

Maintenant, étendons ceci et à côté de user avons user_access et user_actions par exemple, donc 3 tables.

Des questions:

  1. Pour chaque table de la salle, je crée des entités. Dois-je en avoir 3 Dao une pour chaque entité (userDao, userAccessDao, userActionsDao) ou juste une classe générale AppDao?

  2. Il en va de même pour le référentiel. Un référentiel pour l'application entière ou des référentiels pour chaque entité (RepositoryUser, RepositoryUserAccess, RepositoryUserActions?

  3. Si mon application a une activité principale et plusieurs fragments, dois-je créer un ViewModel pour chaque fragment?

26
Alin

1

Vous devriez avoir des DAO contextuels, disons un UserDao qui devrait contenir les requêtes liées aux utilisateurs, si vous avez des publications dans votre application, vous devriez avoir un PostDao pour tout ce qui concerne les publications.

2

Même logique pour les référentiels, rappelez-vous le principe de responsabilité unique pour les classes, respectant ce principe, vous devez avoir des référentiels pour chaque type d'entités séparées (UserRepository, PostRepository ...).

3

En suivant tous les nouveaux concepts décrits comme Jetpack, vous devriez avoir un modèle de vue par fragment, sauf pour une raison étrange, vous avez deux fragments qui nécessitent exactement la même logique, et il est très peu probable que cela se produise puisque l'objectif d'un fragment est d'être réutilisé.

27

Pour observer la source de données du référentiel en vue à l'aide de viewModel et du référentiel, suivez les étapes.

Tout d'abord, dans le référentiel, vous obtiendrez les données de dao ou de l'appel réseau dans la fonction de suspension.

Utilisation de coroutines kotlin

 class YourRepository( ) {
        // ....
        //  dao or retrofit services cof
        override suspend fun getUsers(url: String): Response<List<YourObject>> {
            return withContext(Dispatchers.IO) {
                UserDao.getUsers()  
               //retrofitService.getUser().execute()

            }
        }}

Dans le Viewmodel, vous observerez les données dans coroutinescope.

class MainViewModel() : ViewModel() {
    // .... view model configuration
    private var _yourResponse = MutableLiveData<List<YourObject>>()
    private var yourResponse: LiveData<List<YourObject>> = _yourResponse

    fun getUsers(url:String) {
        viewModelScope.launch {
            withContext(Dispatchers.IO)
            {
                val users= yourRepository.getUsers()
                if (user.size!=0) {
                    withContext(Dispatchers.Main) {
                        _yourResponse.value = users
                    }
                }
            }
        }
    }}

Et enfin, en activité ou en fragment, observez les données vécues votre réponse

0
Zulqarnain