我对@Upsert 的理解是,如果一行存在,它将更新记录;如果不存在,它将插入。
它应该使用您的可用代码,但修改为不使用类型转换器,它确实如此。例如使用:-
@Entity(tableName = "appointment")
data class AppointmentEntity(
@PrimaryKey
@field:ColumnInfo(name = "activity_id")
val activityId: Long,
@field:ColumnInfo(name = "selected_owner")
val selectedOwner: String,
val activityStartTimestamp: Long?=System.currentTimeMillis() / 1000, /*<<<< CHANGED FROM Instant */
val activityEndTimestamp: Long?=System.currentTimeMillis() / 1000, /*<<<< CHANGED FROM Instant */
val activityRevisionTimestamp: Long?=System.currentTimeMillis() / 1000, /*<<<< CHANGED FROM Instant */
//val appointmentTypeCode: AppointmentTypeCode, /*<<<<< COMMENTED OUT */
val contactName: String?,
val activityDescription: String?,
val recurringId: Long?,
val cancelled: Boolean,
val personalAppointment: Boolean,
val outlookIndicator: Boolean,
val allDayEvent: Boolean,
val deleteDate: Long?=null /*<<<< CHANGED FROM Instant */
)
@Database(entities = [AppointmentEntity::class], exportSchema = false, version = 1)
abstract class TheDatabase: RoomDatabase() {
abstract fun getAllDao(): AllDao
companion object {
private var instance: TheDatabase?=null
fun getInstance(context: Context): TheDatabase {
if (instance==null) {
instance = Room.databaseBuilder(context,TheDatabase::class.java,"the_database.db")
.allowMainThreadQueries()
.build()
}
return instance as TheDatabase
}
}
}
@Dao
interface AllDao {
@Upsert
fun insertAppointments(appointment: List<AppointmentEntity>)
}
和 :-
class MainActivity : AppCompatActivity() {
lateinit var db: TheDatabase
lateinit var dao: AllDao
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var appointmentEntity1 = AppointmentEntity(activityId = 1, selectedOwner = "O001", contactName = "C001", recurringId = 0, cancelled = false, activityDescription = "Desc001", personalAppointment = true, outlookIndicator = false, allDayEvent = false)
var appointmentEntity2 = AppointmentEntity(activityId = 1, selectedOwner = "O001", contactName = "C002", recurringId = 0, cancelled = false, activityDescription = "Desc002", personalAppointment = true, outlookIndicator = false, allDayEvent = false)
db = TheDatabase.getInstance(this)
dao = db.getAllDao()
dao.insertAppointments(listOf(appointmentEntity1,appointmentEntity2,appointmentEntity1,appointmentEntity2))
}
}
结果成功运行,App Inspection 显示:-
- 即它已经处理了 4 个 UPSERTS,结果数据符合预期。
这个问题可能在其他地方。可能是因为您似乎在使用 sqlcipher 或其他数据库操作。