I tried to retrieve a single record from Room database but it gives me a null value. Here is my code:
GroupDAO.kt
@Dao
interface GroupDAO {
@Query("SELECT * FROM groups")
fun getAllGroups(): Flow<List<Group>>
@Query("SELECT * FROM groups WHERE groupId = :groupId")
fun getGroupById(groupId: Int): Group?
@Insert
suspend fun insertGroup(group: Group): Long
@Update
suspend fun updateGroup(group: Group)
@Delete
suspend fun deleteGroup(group: Group)
@Query("DELETE FROM groups")
suspend fun deleteAllGroups()
}
GroupRepository.kt
class GroupRepository (application: Application) {
private var groupDao: GroupDAO = AppDatabase.getDatabase(application).groupDAO()
val allGroups: Flow<List<Group>> = groupDao.getAllGroups()
suspend fun getGroupById(groupId: Int): Group? {
return groupDao.getGroupById(groupId)
}
suspend fun insert(group: Group): Long {
return groupDao.insertGroup(group)
}
suspend fun delete(group: Group) {
groupDao.deleteGroup(group)
}
suspend fun update(group: Group) {
groupDao.updateGroup(group)
}
suspend fun deleteAllGroups() {
groupDao.deleteAllGroups()
}
}
GroupViewModel.kt
class GroupViewModel(application: Application): AndroidViewModel(application) {
private val groupRepository: GroupRepository
private val inviteRepository: InviteRepository
init {
groupRepository = GroupRepository(application)
inviteRepository = InviteRepository(application)
}
val allGroups: LiveData<List<Group>> = groupRepository.allGroups.asLiveData()
val group = mutableStateOf<Group?>(null)
fun getGroupById(groupId: Int) {
viewModelScope.launch {
group.value = groupRepository.getGroupById(groupId)
}
}
fun insertGroup(group: Group, users: List<User>) = viewModelScope.launch(Dispatchers.IO) {
val groupIdLong = groupRepository.insert(group)
val groupId = groupIdLong.toInt()
users.forEach { user ->
val invite = Invite(0, user.userId, groupId, false)
inviteRepository.insert(invite)
}
}
fun updateGroup(group: Group) = viewModelScope.launch(Dispatchers.IO) {
groupRepository.update(group)
}
fun deleteGroup(group: Group) = viewModelScope.launch(Dispatchers.IO) {
groupRepository.delete(group)
}
fun deleteAllGroups() {
viewModelScope.launch(Dispatchers.IO) {
groupRepository.deleteAllGroups()
}
}
}
EditGroup.kt
@Composable
fun EditGroup(groupViewModel: GroupViewModel, groupId: Int) {
Column(
modifier = Modifier
.fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally
)
{
LaunchedEffect(groupId) {
groupViewModel.getGroupById(groupId)
}
val currentGroup = groupViewModel.group.value
}
}
I tried looking across Github, Medium, and other online resources on how to do this and align with my current code but it still does not work.
New contributor
Rosie is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.