问题描述
如何在不编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)
}
解决方法
- 创建一个类似的 Dao(或修改现有的 Dao 以包含@Insert,如下所示)
:-
@Dao
interface RawDao {
@Insert
fun insertManyRaws(raws: List<Raw>): List<Long>
}
- 正常创建@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
}
}
运行上述结果:-
即3 个原始数据已添加到数据库中,如使用 AS 的数据库检查器所见
- 注意 dao.insertManyRaws 调用以列表形式返回插入的 id(如果有 -1 则表示未插入 Raw)