如何在 Android 中插入列表到 table with Dao Room 当有主键时

How to insert a List to a table with Dao Room in Android when there is a primarykey

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

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

如何在不编造id的情况下将代码插入table?

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

房间:

@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"),Raw(0L,"etc...."))
        db = Room.databaseBuilder(this,RawDatabase::class.java,"raw.db")
                .allowMainThreadQueries()
                .build()
        dao = db.getRawDao();
        dao.insertManyRaws(rawList) //<<<<<<<<<< ADD All Raws at once
    }
}

运行 以上结果为:-

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

  • 请注意 dao.insertManyRaws 调用 returns,作为列表,插入的 ID(如果有 -1 则未插入 Raw)