我在 Room 中有一个 Transaction,就像文档中给出的那样。
@Dao
abstract class SongDao {
@Insert
abstract fun insert(song: Song)
@Delete
abstract fun delete(song: Song)
@Transaction
fun insertAndDeleteInTransaction(newSong: Song, oldSong: Song) {
// Anything inside this method runs in a single transaction.
insert(newSong)
delete(oldSong)
}
}
我的用例是我不想在 Dao 中公开
delete()
以便从 Dao 外部调用。创建方法
private
不是一个选项,因为 Kotlin 的接口中不允许使用 private
方法。
您可以从构建的数据库实例中通过 openHelper 函数获取 SupportSQLiteDatabase 并使用删除、execSQL 或查询函数。
例如沿着以下路线:-
db = TheDatabase.getInstance(this)
db.openHelper.writableDatabase.delete("the_table","the_column=?", arrayOf("the_value"))
db.openHelper.writableDatabase.execSQL("DELETE FROM the_table WHERE the_column =?", arrayOf("the_value"))
db.openHelper.writableDatabase.query("DELETE FROM the_table, WHERE the_column =?", arrayOf("the_value"))
基于您的代码和嵌入的歌曲数据类的示例使用:-
class MainActivity : AppCompatActivity() {
lateinit var db: TheDatabase
lateinit var dao: AllDao
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
db = TheDatabase.getInstance(this)
dao = db.getAllDao()
insertAndDeleteInTransaction(Song(songName = "The Song"),Song(100,"whatever"))
}
private fun insertAndDeleteInTransaction(newSong: Song, oldSong: Song ) {
val helper=db.openHelper.writableDatabase
helper.beginTransaction()
val newSongRowid = dao.insert(newSong)
val numberOfSongsDeleted = helper.delete("song","songId=?", arrayOf(oldSong.songid))
helper.setTransactionSuccessful() /* IF not set then changes would be rolled back */
helper.endTransaction()
}
@Entity
data class Song(
@PrimaryKey
var songid: Long?=null,
var songName: String
)
}
rowid
所有表(除了一些罕见的例外)都有一个名为 rowid 的列。在 Song 表作为主键的情况下,songId 是整数类型(Long、Int、Byte ....),那么它是 rowid 的别名。
因此上面的 newSong 插入,没有指定 SongId 的值,将会生成该值(不需要
autoGenerate = true
)。
您可能希望参考 https://www.sqlite.org/rowidtable.html 以及 https://sqlite.org/autoinc.html (如果您使用 autoGenerate=true,则应用自动增量)
我认为你应该能够将删除功能设为内部功能。我在 Room 文档中没有看到 DAO 中有任何可见性要求。如果您将 DAO 分离到单独的模块中,则删除功能的可见性将仅限于该模块内。