AndroidアーキテクチャコンポーネントとMVVMパターンで、いくつか質問があります。
Web上のほとんどの例に基づいて、通常は単純な例があります。
部屋@Entity public class User{ ... }
のエンティティを持っている
DAOを持っている@Dao public interface UserDao{ ... }
リポジトリがあるpublic class UserRepository{ }
ViewModel public class UsersListViewModel extends AndroidViewModel{ .... }
これを拡張して、user
の横に、たとえばuser_access
とuser_actions
があるので、3つのテーブルがあります。
質問:
Roomのテーブルごとにエンティティを作成します。各エンティティ(userDao、userAccessDao、userActionsDao)ごとに3つのDao
が必要ですか、それとも一般的なAppDao
クラスが必要ですか?
リポジトリについても同様です。アプリ全体の1つのリポジトリまたは各エンティティのリポジトリ(RepositoryUser、RepositoryUserAccess、RepositoryUserActions?
アプリに1つのメインアクティビティと複数のフラグメントがある場合、フラグメントごとに1つのViewModelを作成する必要がありますか?
コンテキストDAOが必要です。たとえば、ユーザーに関連するクエリを含むUserDaoがあるとします。アプリに投稿がある場合、投稿に関連するすべてのPostDaoが必要です。
リポジトリについても同じロジックです。クラスの単一責任原則を覚えておいてください。その原則に従って、エンティティの種類ごとにリポジトリを用意する必要があります(UserRepository、PostRepository ...)。
Jetpackとして説明されているすべての新しい概念に従って、1つの奇妙な理由でまったく同じロジックを必要とする2つのフラグメントがあり、フラグメントの目的が再利用されるために発生する可能性が非常に低い場合を除き、フラグメントごとに1つのビューモデルが必要です。
ViewModelとリポジトリを使用して、ビューのリポジトリからデータソースを観察するには、次の手順に従います。
まず、repositoryで、daoまたはサスペンド関数のネットワーク呼び出しからデータを取得します。
コルーチン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()
}
}}
Viewmodelでは、コルーチンスコープでデータを観察します。
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
}
}
}
}
}}
そして最後に、アクティビティまたはフラグメントでライブデータを観察しますyourResponse