繁体   English   中英

无法在 Android 的房间数据库中插入值 [Kotlin]

[英]Unable to Insert values in Room Database in Android [Kotlin]

我试图在我的房间数据库中插入值,但应用程序检查没有显示任何内容。 我有一个复杂的应用程序结构,有很多表和一个数据库。 我能够对除一个表之外的所有表执行 CRUD 操作。 我无法确定我做错了什么。

代码 -->

实体

@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
interface FloorTimeDao {

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

存储库

class AddTimeRepository(private val timeDao: FloorTimeDao) {

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

视图模型

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

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

视图模型工厂

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

用于增加价值的代码内部代码

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

一切似乎都被正确添加了,我似乎仍然无法找出我在这里做错了什么。 任何帮助,将不胜感激。 如果您需要更多代码,我可以提供,请告诉我。

注意:使用此代码基本上我试图将时间存储在房间数据库中,该时间是使用时间选择器对话框从用户那里获取的。

编辑1:发现了一些我不知道它是否与问题或任何东西有关的东西。 但是对于我能够插入和读取数据的表,function 会这样说: 在职的

对于表( TimeEntity ),function 说: 不工作

不同之处在于(对于它正在工作的那个)功能说Choose Implementation并在左侧有一个绿色符号。 但是对于它不起作用的表,function 说Choose overridden的方法。

更新:我能够通过为表创建一个新的 Dao 接口来解决这个问题。 我仍然不太确定可能是什么问题,因为两个 DAO 文件看起来都一样。 但我有些怀疑,这可能是由于我们创建新的 DAO 或表时房间自动实现所致。

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

尝试更改 id Int? - 到不可为空的类型 Int 或 Long。 为什么您需要在实体构造函数中具有预定义(初始化)值?

我能够通过创建一个具有相同功能的新 Dao 文件来解决这个问题。 该问题可能是由于 Room Library 提供的 DAO 的自动实现所致。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM