Нет записи в базе данных - PullRequest
0 голосов
/ 11 марта 2020

После вставки данных в RoomDB при извлечении их с помощью mindValleyDao.getCategories().value Возвращается ноль

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>)
}

Я проверяю его, вставляя категорию и выбирая список категорий, таких как

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)
        }
    }
}

1 Ответ

1 голос
/ 11 марта 2020

mindValleyDao.getCategories() имеет тип возврата LiveData, поэтому он запрашивает значение asyn c, вы не должны вызывать .value

Тип LiveData в Room следует использовать только для наблюдения,

Если вы хотите получить значение, измените код на fun getCategories(): List<CategoryBO> вместо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...