由于从用户输入创建对象时需要很长时间,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.
我有四个建议,你可以用最适合你的。
- 将
0L
作为密钥传递。
应该看起来像这样-
mTodoViewModel.addTodo(Todo(0L, titleText, descriptionText))
或
fun addTodo(titleText:String, descriptionText:String) {
viewModelScope.launch(Dispatchers.IO) {
repository.addTodo(Todo(0L, titleText,descriptionText))
}
}
- 稍微改变数据库结构。
@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
- 对您的数据使用辅助构造函数 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.
- 像这样直接给每个构造函数赋值。
Todo(title = titleText, description = descriptionText)
此处将自动考虑 OL
我相信所有这些都应该工作得很好。
如果您还有任何疑问,请随时发表评论。
我用自动生成的 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.
我有四个建议,你可以用最适合你的。
- 将
0L
作为密钥传递。
应该看起来像这样-
mTodoViewModel.addTodo(Todo(0L, titleText, descriptionText))
或
fun addTodo(titleText:String, descriptionText:String) {
viewModelScope.launch(Dispatchers.IO) {
repository.addTodo(Todo(0L, titleText,descriptionText))
}
}
- 稍微改变数据库结构。
@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
- 对您的数据使用辅助构造函数 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.
- 像这样直接给每个构造函数赋值。
Todo(title = titleText, description = descriptionText)
此处将自动考虑 OL
我相信所有这些都应该工作得很好。 如果您还有任何疑问,请随时发表评论。