gpt4 book ai didi

android - 房间数据库 : inserted ID is always 0

转载 作者:行者123 更新时间:2023-11-29 02:24:09 25 4
gpt4 key购买 nike

我正在尝试创建一个列表项的 Room 数据库。我在这里遵循示例:https://medium.com/mindorks/room-kotlin-android-architecture-components-71cad5a1bb35

这是我的数据类:

@Entity(tableName = "itemData")
data class ItemData(@PrimaryKey(autoGenerate = true) var id: Long? = null,
@ColumnInfo(name = "text") var text: String,
@ColumnInfo(name = "checked") var checked: Boolean

)

DAO:

@Dao
interface ItemDataDAO {

@Insert(onConflict = REPLACE)
fun insert(itemData: ItemData) : Long
}

数据库:

@Database(entities = arrayOf(ItemData::class), version = 1)
abstract class ItemDatabase() : RoomDatabase() {


abstract fun itemDataDao(): ItemDataDAO

companion object {
private var INSTANCE: ItemDatabase? = null

fun getInstance(context: Context): ItemDatabase? {
if (INSTANCE == null) {
synchronized(ItemDatabase::class) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
ItemDatabase::class.java, "items.db")
.build()
}
}
return INSTANCE
}

fun destroyInstance() {
INSTANCE = null
}
}
}

工作线程:

class DbWorkerThread(threadName: String) : HandlerThread(threadName) {

private lateinit var mWorkerHandler: Handler

override fun onLooperPrepared() {
super.onLooperPrepared()
mWorkerHandler = Handler(looper)
}

fun postTask(task: Runnable) {
mWorkerHandler.post(task)
}
}

这是调用插入函数的监听器:

editText.setOnEditorActionListener { v, actionId, event ->
return@setOnEditorActionListener when (actionId) {
EditorInfo.IME_ACTION_DONE -> {
createItem(editText)
true
}
else -> false
}
}

这是插入项目时调用的函数:

fun createItem(editText: EditText) {
var text = editText.text.toString().trim()
var itemData = ItemData(text = text, checked = false)
var id : Long? = 0
val task = Runnable {
id = mDb?.itemDataDao()?.insert(itemData)
println("inserted $id")
}
mDbWorkerThread.postTask(task)
}

但 ID 始终为 0,因此只会插入一项。任何人都可以看到问题吗?

我也曾尝试删除 id 的默认 null 值,但结果相同。

最佳答案

以下更改解决了该问题。

而不是像这样调用构造函数

var itemData = ItemData(text = text, checked = false)

我调用了默认的构造函数,构造完之后再设置参数。

var itemData = ItemData()
itemData.text = text
itemData.checked = false

这需要 ItemData 实体的以下构造函数:

constructor():this(null,"",false)

关于android - 房间数据库 : inserted ID is always 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53266920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com