Home > Back-end >  Unable to Insert values in Room Database in Android [Kotlin]
Unable to Insert values in Room Database in Android [Kotlin]

Time:08-24

I am trying to insert values inside my room database but the App Inspection is showing nothing. I have a complex app structure with lot of tables and one database. I am able to perform CRUD operations on all of the tables except for one. I am not able to identify what I am doing wrong.

Code -->

Entity

@Entity(tableName = "add_time")
data class TimeEntity(

    @PrimaryKey(autoGenerate = true)
    var id: Int? = null,

    @ColumnInfo(name = "start_time")
    var startTime: String? = "",

    @ColumnInfo(name = "end_time")
    var endTime: String? = "",

    @ColumnInfo(name = "running_time")
    var runningTime: String? = "",

    )

DAO

@Dao
interface FloorTimeDao {

    //Insert time
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    suspend fun insertTimeForScheduling(timeEntity: TimeEntity) {
    }
}

REPOSITORY

class AddTimeRepository(private val timeDao: FloorTimeDao) {

    //insert
    @WorkerThread
    suspend fun insertTime(time: TimeEntity) = timeDao.insertTimeForScheduling(time)
}

VIEWMODEL

class AddTimeViewModel(private val repository: AddTimeRepository) : ViewModel() {

    //insert
    fun insertTime(timeEntity: TimeEntity) = viewModelScope.launch {
        repository.insertTime(timeEntity)
    }
}

VIEWMODEL FACTORY

@Suppress("UNCHECKED_CAST")
class AddTimeViewModelFactory(private val repository: AddTimeRepository) :
    ViewModelProvider.Factory {

    override fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T {
        if (modelClass.isAssignableFrom(AddTimeViewModel::class.java)) {
            return AddTimeViewModel(repository) as T
        }
        throw IllegalArgumentException("Unknown ViewModel Class")
    }
}

CODE INSIDE FRAGMENT FOR ADDING VALUE

        //Inserting new time in the table
        binding.btnAddTime.setOnClickListener {
            try {
                timeRunning = timeEnd - timeStart
                timeRunning = abs(timeRunning)
                Timber.d("Final Time start : $timeStart")
                Timber.d("Final Time end : $timeEnd")
                Timber.d("Final Time running : $timeRunning")
                val timeEntity = TimeEntity(
                    startTime = timeStart.toString(),
                    endTime = timeEnd.toString(),
                    runningTime = timeRunning.toString()
                )
                Timber.d("Time Entity: $timeEntity")
                addTimeViewModel.insertTime(timeEntity)
            } catch (e: Exception) {
                Timber.d("Exception : $e")
            }
        }

Everything seems to be added correctly and I still cannot seem to find out what I am doing wrong here. Any help would be appreciated. If you need more code I can provide just let me know.

NOTE: With this code basically I am trying to store the time in room database which is taken from the user using Time Picker Dialog.

Edit 1: Found something which I don't know if it is related to the issue or anything. But for the tables in which I am able to insert and read the data the function says something like this : working

and for the table (TimeEntity) the function says this : not working

The difference is that (for the one in which it is working) the functions says Choose Implementation and have a green symbol on left side. But for the table for which it is not working the function says Choose overridden method.

Update: I was able to fix the issue by creating a new Dao Interface for the table. I am still not very sure what might have been the issue as both DAO files looks same. But I have some doubt that it might be due to the room automatic implementations when we create new DAO's or table.

CodePudding user response:

@PrimaryKey(autoGenerate = true)
var id: Int? = null,

Try to change id Int? - To non nullable type Int or Long. Why do you need to have predefined (initialized) values in entity constructor?

CodePudding user response:

I was able to fix the issue by creating a new Dao file with same functions. The issue may have been due to the automatic implementation of DAO's provided by Room Library.

  • Related