由于从用户输入创建对象时需要很长时间,Kotlin Room 无法将新对象添加到视图模型存储库

Kotlin Room can't add new object to viewmodel repository due to required long when creating object from user input

我用自动生成的 ID 创建了实体 class。

@Entity(tableName = "todo_list")
data class Todo(
@PrimaryKey(autoGenerate = true)
var itemId: Long = 0L,
@ColumnInfo(name = "todo_title")
val title: String,
@ColumnInfo(name = "todo_description")
val description: String)

和视图模型class

class TodoViewModel(application: Application) : AndroidViewModel(application) {

val readAllData: LiveData<List<Todo>>
private val repository: TodoRepository

init {
    val todoDao = TodoDatabase.getInstance(application).todoDao()
    repository = TodoRepository(todoDao)
    readAllData = repository.readAllData
}

fun addTodo(todo: Todo) {
    viewModelScope.launch(Dispatchers.IO) {
        repository.addTodo(todo)
    }
}

fun deleteTodo(todo: Todo) {
    viewModelScope.launch (Dispatchers.IO ){
        repository.deleteTodo(todo = todo)
    }
  }
}

但是当我想在按钮上添加待办事项时,点击它仍然需要添加长。

mTodoViewModel.addTodo(Todo(titleText, descriptionText))

我是不是添加了错误的新对象,或者有什么办法可以解决这个问题?

问题是数据 class 构造函数需要 3 个参数,但只传递了 2 个。

虽然现在,您已经为数据 class 提供了默认值,但由于它在数据 class 中排在第一位,因此即使值相同也需要定义它,即 0L.

我有四个建议,你可以用最适合你的。

  1. 0L 作为密钥传递。

应该看起来像这样-

mTodoViewModel.addTodo(Todo(0L, titleText, descriptionText))

fun addTodo(titleText:String, descriptionText:String) {
    viewModelScope.launch(Dispatchers.IO) {
        repository.addTodo(Todo(0L, titleText,descriptionText))
    }
}
  1. 稍微改变数据库结构。
@Entity(tableName = "todo_list")
data class Todo(

    @ColumnInfo(name = "todo_title")
    val title: String,
    @ColumnInfo(name = "todo_description")
    val description: String,
    @PrimaryKey(autoGenerate = true)
    var itemId: Long = 0L
)

这里因为默认值在最后所以不需要发送0L

  1. 对您的数据使用辅助构造函数 class。

应该看起来像这样 -

@Entity(tableName = "todo_list")
data class Todo(
    @PrimaryKey(autoGenerate = true)
    var itemId: Long = 0L,
    @ColumnInfo(name = "todo_title")
    val title: String,
    @ColumnInfo(name = "todo_description")
    val description: String
) {
    constructor(title: String, description: String) : this(title, description, 0L)
}
Here now you have 2 constructors one with 3 parameters, the other with 2.

  1. 像这样直接给每个构造函数赋值。

Todo(title = titleText, description = descriptionText)

此处将自动考虑 OL

我相信所有这些都应该工作得很好。 如果您还有任何疑问,请随时发表评论。