当_id 是INTEGER + PRIMARY_KEY+ AUTOINCREMENT 时,为什么Anko 不能忽略传递的_id 值?
Why can't Anko ignore the passed value of _id when _id is INTEGER + PRIMARY_KEY+ AUTOINCREMENT?
我设计的_id字段是INTEGER + PRIMARY_KEY+ AUTOINCREMENT
,我用代码SettingManage().addSetting(MSetting(10L,"My Settings",2000L,"This is description!"))
插入一条记录到table.
我认为Anko会忽略传递给_id的值10并自动传递一个新值给_id,但实际上_id的值10被插入到table中。
当_id为INTEGER + PRIMARY_KEY+ AUTOINCREMENT
时,如何让Anko忽略传递给_id的值?
插入数据
SettingManage().addSetting(MSetting(10L,"My Settings",2000L,"This is description!"))
设计Table
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 本身 overrides auto increment when a custom value is passed。如果没有传递值 -> 自动值。否则 -> 手册。由于 PRIMARY_KEY
,它假定它是唯一的,但这是一个不同的问题。
据我所知,Anko 中没有允许手动覆盖它的集成功能。相反,您唯一能做的就是不传递值。任何错误的 SQL 查询都不会被 Anko 本身捕获,而是被原始的 SQL 捕获。 SQL 会抛出任何异常,这意味着 Anko 不会检查丢失的数据。
简单地说,不要传递 ID。您可以编写一个函数,它仍然接收 ID,但如果该行设置为 PRIMARY_KEY 和 AUTO_INCREMENT.
则丢弃它
我对源代码做了更多的挖掘,如果设置为自动递增,则不支持忽略传递的值。
这意味着您可以让它真正自动递增的唯一方法是不传递任何值。如果您使用任何类型的手动查询,您根本就不会传递任何值。所以,不要给数据库 ID。因为它是自动递增的,所以它会自动添加它,而且是在基础 SQL 级别上。
Ank 默认情况下不会忽略它,因为它本质上是 SQLite 的包装器。这意味着如果应该覆盖 ID,则必须能够传递它(请参阅此答案第二句中的 link)。因此,Anko 忽略它会导致更多问题,而不是它带来的好处。你必须确保它没有通过
我设计的_id字段是INTEGER + PRIMARY_KEY+ AUTOINCREMENT
,我用代码SettingManage().addSetting(MSetting(10L,"My Settings",2000L,"This is description!"))
插入一条记录到table.
我认为Anko会忽略传递给_id的值10并自动传递一个新值给_id,但实际上_id的值10被插入到table中。
当_id为INTEGER + PRIMARY_KEY+ AUTOINCREMENT
时,如何让Anko忽略传递给_id的值?
插入数据
SettingManage().addSetting(MSetting(10L,"My Settings",2000L,"This is description!"))
设计Table
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 本身 overrides auto increment when a custom value is passed。如果没有传递值 -> 自动值。否则 -> 手册。由于 PRIMARY_KEY
,它假定它是唯一的,但这是一个不同的问题。
据我所知,Anko 中没有允许手动覆盖它的集成功能。相反,您唯一能做的就是不传递值。任何错误的 SQL 查询都不会被 Anko 本身捕获,而是被原始的 SQL 捕获。 SQL 会抛出任何异常,这意味着 Anko 不会检查丢失的数据。
简单地说,不要传递 ID。您可以编写一个函数,它仍然接收 ID,但如果该行设置为 PRIMARY_KEY 和 AUTO_INCREMENT.
则丢弃它我对源代码做了更多的挖掘,如果设置为自动递增,则不支持忽略传递的值。
这意味着您可以让它真正自动递增的唯一方法是不传递任何值。如果您使用任何类型的手动查询,您根本就不会传递任何值。所以,不要给数据库 ID。因为它是自动递增的,所以它会自动添加它,而且是在基础 SQL 级别上。
Ank 默认情况下不会忽略它,因为它本质上是 SQLite 的包装器。这意味着如果应该覆盖 ID,则必须能够传递它(请参阅此答案第二句中的 link)。因此,Anko 忽略它会导致更多问题,而不是它带来的好处。你必须确保它没有通过