为什么当_id是整数+PRIMARY_KEY+自动增量时,安科不能忽略_id传递的值?



我设计了_id字段为INTEGER + PRIMARY_KEY+ AUTOINCREMENT,我使用代码SettingManage().addSetting(MSetting(10L,"My Settings",2000L,"This is description!"))向表中插入一条记录。

我认为Anko会忽略传递的_id值10,并自动向_id传递一个新值,但实际上_id的值10被插入到表中。

当_id为INTEGER + PRIMARY_KEY+ AUTOINCREMENT时,如何让Anko忽略传递的_id值?

插入数据

SettingManage().addSetting(MSetting(10L,"My Settings",2000L,"This is description!"))

设计表

class DBSettingHelper(mContext: Context = UIApp.instance) : ManagedSQLiteOpenHelper(
mContext,
DB_NAME,
null,
DB_VERSION) {
companion object {
val DB_NAME = "setting.db"
val DB_VERSION = 5
val instance by lazy { DBSettingHelper() }
}
override fun onCreate(db: SQLiteDatabase) {
db.createTable( DBSettingTable.TableNAME , true,
DBSettingTable._ID to INTEGER + PRIMARY_KEY+ AUTOINCREMENT ,
DBSettingTable.Name to TEXT,
DBSettingTable.CreatedDate to INTEGER,
DBSettingTable.Description to TEXT
)
}
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
db.dropTable(DBSettingTable.TableNAME, true)
onCreate(db)
}
}

class DBSetting(val mMutableMap: MutableMap<String, Any?>) {
var _id: Long by mMutableMap
var name: String by mMutableMap
var createdDate: Long by mMutableMap
var description: String by mMutableMap
constructor(_id: Long, name: String, createdDate: Long, description: String)
: this(HashMap()) {
this._id = _id
this.name = name
this.createdDate = createdDate
this.description=description
}
}

object DBSettingTable {
val TableNAME = "SettingTable"
val _ID = "_id"
val Name = "name"
val CreatedDate = "createdDate"
val Description="description"
}

data class MSetting (
val _id: Long,  
val name: String,
val createdDate: Long,
val description: String
)

业务逻辑

class SettingManage {
fun addSetting(mMSetting:MSetting){
DBSettingManage().addDBSetting(DbDataMapper().convertMSetting_To_DBSetting(mMSetting))
}
}
class DBSettingManage(private val mDBSettingHelper: DBSettingHelper =DBSettingHelper.instance) {
fun addDBSetting(mDBSetting: DBSetting)=mDBSettingHelper.use{
insert(DBSettingTable.TableNAME,*mDBSetting.mMutableMap.toVarargArray())
}
}
class DbDataMapper {
fun convertMSetting_To_DBSetting(mMSetting: MSetting) =with(mMSetting){
DBSetting(_id,name,createdDate,description)
}
fun convertDBSetting_To_MSetting(mDBSetting: DBSetting)=with(mDBSetting){
MSetting(_id,name,createdDate,description )
}
}

fun <T : Any> SelectQueryBuilder.parseList(parser: (Map<String, Any?>) -> T): List<T> =
parseList(object : MapRowParser<T> {
override fun parseRow(columns: Map<String, Any?>): T = parser(columns)
})

Anko在您的使用中是SQLite的包装器。传递自定义值时,SQL本身会覆盖自动增量。如果未传递任何值->自动值。否则->手动。由于PRIMARY_KEY,它假设它是唯一的,但这是一个不同的问题。

据我所知,Anko中没有允许手动覆盖的集成功能。相反,您唯一能做的就是不传递值。任何错误的SQL查询都不会被Anko本身捕获,而是被原始SQL捕获。SQL会抛出任何异常,这意味着Anko不会检查丢失的数据。

简单地说,不要传递ID。您可以编写一个函数,该函数仍然接受ID,但如果该行设置为PRIMARY_KEY和AUTO_INCREMENT,则会丢弃它。


我在源代码中做了更多的挖掘,如果设置为自动递增,则不支持忽略传递的值。

这意味着,让它真正自动递增的唯一方法是不传递任何值。如果您使用任何类型的手动查询,那么您根本不会传递任何值。所以,不要给数据库ID。因为它是自动递增的,它会自动添加它,这是在基本SQL级别上。

默认情况下,Ank不会忽略它,因为它本质上是SQLite的包装器。这意味着如果ID应该被覆盖,它必须能够被传递(请参阅本答案第二句中的链接)。因此,安科忽视它会带来更多的问题,而不是好处。你必须确保它不是通过

最新更新