Search code examples
androidkotlinandroid-roomandroid-viewmodel

No record save in room database


After inserting data into RoomDB when I fetch it using mindValleyDao.getCategories().value It returns null

DatabaseClass

@Database(entities = arrayOf(CategoryBO::class), version = 1, exportSchema = false)
abstract class MindValleyDatabase : RoomDatabase(){

    abstract fun mindValleyDao(): MindValleyDao

    companion object {
        // Singleton prevents multiple instances of database opening at the
        // same time.
        @Volatile
        private var INSTANCE: MindValleyDatabase? = null

        fun getDatabase(context: Context): MindValleyDatabase {
            val tempInstance = INSTANCE
            if (tempInstance != null) {
                return tempInstance
            }
            synchronized(this) {
                val instance = Room.databaseBuilder(
                        context.applicationContext,
                        MindValleyDatabase::class.java,
                        "mindvalley_database"
                ).allowMainThreadQueries()
                        .fallbackToDestructiveMigration().build()
                INSTANCE = instance
                return instance
            }
        }
    }
}

CategoryBO.kt

@Entity(tableName = "CategoryEntity")
data class CategoryBO( @PrimaryKey(autoGenerate = true) val id:Int, val name:String)

Doa

@Dao
interface MindValleyDao {

    @Query("SELECT * from CategoryEntity ORDER BY id ASC")
    fun getCategories(): LiveData<List<CategoryBO>>

    @Insert(onConflict = OnConflictStrategy.IGNORE)
    fun insert(categoryBO: CategoryBO)
    //suspend fun insert(categoryBO: CategoryBO)

    @Insert(onConflict = OnConflictStrategy.IGNORE)
    fun insert(categoryBOList: List<CategoryBO>)
}

I am testing it by inserting Category and fetching list of categories like

class MindValleyViewModelNew @Inject constructor() : BaseViewModel() {

    var categoryList: MutableLiveData<List<CategoryBO>> = MutableLiveData()
    private lateinit var mindValleyDao:MindValleyDao

    fun loadDatabase(mContext:Context){
        mindValleyDao = MindValleyDatabase.getDatabase(mContext).mindValleyDao()
        GlobalScope.launch(Dispatchers.IO) {
            mindValleyDao.insert(CategoryBO(0,"first item"))
            val cats = mindValleyDao.getCategories().value
            categoryList.postValue(cats)
        }
    }
}

Solution

  • mindValleyDao.getCategories() has return type is LiveData, that's why it query value async, you shouldn't call .value

    LiveData type in Room should only use for observe,

    If you want to get value, modify your code to fun getCategories(): List<CategoryBO> instead