Intereting Posts
Расширение класса данных Kotlin для использования с JPA? В nougat Failure возвращает результат ResultInfo {}} в действие {com.example. *. * / Com.example. *. *. MainActivity}: Kotlin OnTouchListener вызвал, но он не отменяет performClick Получить запись с максимальным значением с карты в Котлин Создайте текущую функцию генерации с помощью RxJava2 TornadoFX – удалить элемент с помощью контекстного меню правой кнопкой мыши Как установить вкладку BottomNavigationView по умолчанию в Kotlin? Оператор разрешения масштаба в Котлине Как преобразовать этот код Java в код Kotlin? Как реализовать абстрактную функцию в константах Enum котлин с пружинной нагрузкой на затмение Новая архитектура с кинжалом и Котлином Использование объекта Kotlin в классе, сгенерированном во время выполнения Пользовательский вертикальный просмотрщик не работает с прослушивателем onClick в дочернем представлении Выделение синтаксиса Fisheye / Crucible для Kotlin

Почему Anko не может игнорировать переданное значение _id, когда _id является INTEGER + PRIMARY_KEY + AUTOINCREMENT?

Я создал поле INTEGER + PRIMARY_KEY+ AUTOINCREMENT , я использую код SettingManage().addSetting(MSetting(10L,"My Settings",2000L,"This is description!")) Чтобы вставить запись в таблицу.

Я думаю, что Anko проигнорирует пройденное значение 10 из _id и автоматически передаст новое значение в _id, но на самом деле значение 10 из _id вставлено в таблицу.

Как заставить Anko игнорировать переданное значение _id, когда _id является INTEGER + PRIMARY_KEY+ AUTOINCREMENT ?

Вставить данные

 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 не будет проверять отсутствие данных.

Просто не передавайте идентификатор. Вы можете написать функцию, которая по-прежнему принимает идентификатор, но отбрасывает его, если для строки установлено значение PRIMARY_KEY и AUTO_INCREMENT.


Я сделал больше копания в исходном коде, и нет поддержки для игнорирования переданных значений, если он настроен на автоматическое увеличение.

Это означает, что единственный способ заставить его фактически автоматически увеличивать – это не передавать никакие значения. Если вы используете ручные запросы любого типа, вы просто не передаете никакого значения. Таким образом, не давайте базе данных ID. Поскольку он автоматически увеличивается, он автоматически добавляет его, и это находится на базовом уровне SQL.

Ank не игнорирует его по умолчанию, потому что это, по сути, оболочка для SQLite. Это значит, что он должен быть передан, если идентификатор должен быть переопределен (см. Ссылку во втором предложении этого ответа). Таким образом, Анко, игнорируя это, вызовет больше проблем, чем это принесет пользу. Вы должны убедиться, что он не передается