我正在尝试创建列表项的房间数据库。下面我举一个例子: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
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
值,但结果相同。
您需要添加一个自动增量列:
@Entity(tableName = "item_data")
public class ItemData extends BaseObservable {
/** Fields */
@ColumnInfo(name = "item_id")
@PrimaryKey(autoGenerate = true)
private int itemId;
...
}
以下更改修复了该问题。
而不是像这样调用构造函数
var itemData = ItemData(text = text, checked = false)
我调用了默认构造函数,然后在构造之后设置参数。
var itemData = ItemData()
itemData.text = text
itemData.checked = false
这要求ItemData实体具有以下构造函数:
constructor():this(null,"",false)
问题内容: SQL Server数据库ID是否始终为正? 如sysdatabases中的dbid中所述。 这个问题与标识列或主键无关。 问题答案: 编辑,因为您更改了问题。 在此查询中:SELECT名称,来自master.dbo.sysdatabases的dbid。dbid的值始终为正,因为它被定义为1,1身份。
我可以使用RxJava添加一行,如下所示, 道: DB操作后如何获取行id?
我有一个插入行的查询 我正在使用RxJava在后台线程上执行查询: 目前,它成功返回为插入的DAO新创建的主键。如何返回整个插入的行,而不使用新的行ID执行第二次查询? 在postgreql我会做这样的事情: 不知道如何使用房间图书馆
错误:查询有问题:[SQLITE_ERROR]SQL错误或缺少数据库(没有这样的表:任务) 显示了这个错误,我怎么可能修复它? 我正在学习这个教程
并且我发现了基于数据库版本4的可能场景的迁移varargs。 我的问题是,假设我使用的是db v1的Room,当我的应用程序到达db v10时,我将不得不编写多少迁移方法? 在sqlite中,我们在中获得已安装应用程序的当前db版本,我们只需通过开关大小写而不使用break语句,以便满足所有db升级。
我是新来的和我试图我的得到一个从它。我试图这样做的它与这是id但问题是我不知道如何返回目标从。 这就是<代码>刀 这是Repository类