在科特林的房间数据库中添加新记录
adding new records to room database in kotlin
我有以下实体来存储数据库记录
@Entity(tableName = "saves")
data class SaveEntity(
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "primary_key")
val id: Int?,
//rest of the fields
)
还有dao接口
@Dao
interface SavesDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun upsert(entity:SaveEntity)
//rest of the api
}
upsert
方法应该更新记录或添加新记录,如果它没有 exist.In 第一种情况很清楚 - 我从 db 获取记录,修改它然后 update.But 什么关于添加新条目?我在哪里获取主键的值?
我是否必须执行额外的请求才能获取数据库中的记录总数?那么主键自动生成的目的是什么?
Your SQL rule : (onConflict = OnConflictStrategy.REPLACE)
already says that if another entity with the same id is found it will be replaced by the new entity.
虽然您的用例尚不清楚,但您的 ID 是自动生成的,因此尽管两个对象可能具有相同的属性,但它们可以具有不同的 ID。它们被认为相同的唯一情况是,如果您从房间数据库中选择实体并尝试对其进行修改并将其放回原处。
如果您仍希望 upsert() function
用于更新现有实体的任何特定字段,请不要将更新插入 SQLite 查询方法,而是将其作为包含插入或更新逻辑的包装函数。
For example:
@Dao
interface SavesDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(entity:SaveEntity)
@Query("UPDATE item SET like_count = :likeCount WHERE ID = :id")
fun updateLike(id: String, likeCount: Int)
@Query("SELECT * from item WHERE id= :id")
fun getItemById(id:Int):SaveEntity
fun upsert(item:SaveEntity){
val item = getItemById(item.id)
if(item==null){
insert(item)
}else{
updateLike(item.id, item.like+1)
}
}
}
您的用例是 typical/classic 普通数据库 SQL。您不必管理 ID 或自动增量,在这种情况下,SQLite 会为您完成。从 SQLite 文档(下面的链接)中,您可以阅读:
By default, every row in SQLite has a special column, usually called the "rowid", that uniquely identifies that row within the table.
你可以阅读更多here。
还可以帮助阅读 SQLite Autoincrement 以了解显式使用 AUTOINCREMENT 或使用 INTEGER PRIMARY KEY 的含义。
参考文献:
- Accessing data using Room DAOs(插入和更新的工作原理)
- OnConflictStrategy(onConflict REPLACE 的工作原理)
希望对您有所帮助!
我有以下实体来存储数据库记录
@Entity(tableName = "saves")
data class SaveEntity(
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "primary_key")
val id: Int?,
//rest of the fields
)
还有dao接口
@Dao
interface SavesDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun upsert(entity:SaveEntity)
//rest of the api
}
upsert
方法应该更新记录或添加新记录,如果它没有 exist.In 第一种情况很清楚 - 我从 db 获取记录,修改它然后 update.But 什么关于添加新条目?我在哪里获取主键的值?
我是否必须执行额外的请求才能获取数据库中的记录总数?那么主键自动生成的目的是什么?
Your SQL rule : (onConflict = OnConflictStrategy.REPLACE) already says that if another entity with the same id is found it will be replaced by the new entity.
虽然您的用例尚不清楚,但您的 ID 是自动生成的,因此尽管两个对象可能具有相同的属性,但它们可以具有不同的 ID。它们被认为相同的唯一情况是,如果您从房间数据库中选择实体并尝试对其进行修改并将其放回原处。
如果您仍希望 upsert() function
用于更新现有实体的任何特定字段,请不要将更新插入 SQLite 查询方法,而是将其作为包含插入或更新逻辑的包装函数。
For example:
@Dao
interface SavesDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(entity:SaveEntity)
@Query("UPDATE item SET like_count = :likeCount WHERE ID = :id")
fun updateLike(id: String, likeCount: Int)
@Query("SELECT * from item WHERE id= :id")
fun getItemById(id:Int):SaveEntity
fun upsert(item:SaveEntity){
val item = getItemById(item.id)
if(item==null){
insert(item)
}else{
updateLike(item.id, item.like+1)
}
}
}
您的用例是 typical/classic 普通数据库 SQL。您不必管理 ID 或自动增量,在这种情况下,SQLite 会为您完成。从 SQLite 文档(下面的链接)中,您可以阅读:
By default, every row in SQLite has a special column, usually called the "rowid", that uniquely identifies that row within the table.
你可以阅读更多here。
还可以帮助阅读 SQLite Autoincrement 以了解显式使用 AUTOINCREMENT 或使用 INTEGER PRIMARY KEY 的含义。
参考文献:
- Accessing data using Room DAOs(插入和更新的工作原理)
- OnConflictStrategy(onConflict REPLACE 的工作原理)
希望对您有所帮助!