当有主键时,如何在 Android 中使用 Dao Room 将 List 插入到表中

问题描述

我有一个包含 id 和代码的数据类。

我有一个只包含代码的列表。

如何在不编id的情况下将代码插入到表格中?

其实我根本不需要id列,但是Room好像需要主键,code不能为主键。

房间:

@Entity(tableName = "raw_table")
data class Raw(
    @PrimaryKey(autoGenerate = true)
    var id: Long = 0L,@ColumnInfo(name = "code")
    var code: String = "",...

列表和循环:

val codeList : List<String> = ...


for (code in codeList){
    // wrong here,I need the id,but I do not have ids.
    RawDao.insert(code)
}

解决方法

  1. 创建一个类似的 Dao(或修改现有的 Dao 以包含@Insert,如下所示)

:-

@Dao
interface RawDao {
    @Insert
    fun insertManyRaws(raws: List<Raw>): List<Long>
}
  1. 正常创建@Database,包括获取RawDao 的抽象函数。例如

:-

@Database(entities = [Raw::class],version = 1)
abstract class RawDatabase: RoomDatabase() {
    abstract fun getRawDao(): RawDao
}

然后你可以使用类似的东西:-

class MainActivity : AppCompatActivity() {

    lateinit var db: RawDatabase
    lateinit var dao: RawDao
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val rawList: List<Raw> = arrayListOf(Raw(0L,"Test1"),Raw(0L,"Test2"),"etc...."))
        db = Room.databaseBuilder(this,RawDatabase::class.java,"raw.db")
                .allowMainThreadQueries()
                .build()
        dao = db.getRawDao();
        dao.insertManyRaws(rawList) //<<<<<<<<<< ADD All Raws at once
    }
}

运行上述结果:-

enter image description here

即3 个原始数据已添加到数据库中,如使用 AS 的数据库检查器所见

  • 注意 dao.insertManyRaws 调用以列表形式返回插入的 id(如果有 -1 则表示未插入 Raw)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...