Как создать таблицу SQLite с помощью Anko в Котине?

Я проектирую очень простую таблицу, используя Anko в Kotlin, в таблице есть первичный ключ с именем _id, и я надеюсь, что _id автоматически передается значением системой SQLite. Я прочитал несколько примеров кода, но я не знаю, какой из них правильный, метод 1, метод 2 или метод 3?

И еще, когда я вставляю запись, я не думаю, что мне нужно передать значение в _id, но свойство _id для MSetting и DBSetting должно быть передано значение, поэтому мне нужно его инициализировать с помощью MSetting(10L,"My Settings",2000L,"This is description!") Я не знаю, как Anko обрабатывает ненужный _id, и мне очень странно, что приложение не сбой при выполнении SettingManage().addSetting(MSetting(10L,"My Settings",2000L,"This is description!")) Неоднократно!

Метод 1: DBSettingTable._ID to INTEGER + PRIMARY_KEY+ UNIQUE,

Метод 2: DBSettingTable._ID to INTEGER + PRIMARY_KEY+ AUTOINCREMENT,

Метод 3: DBSettingTable._ID to INTEGER + PRIMARY_KEY,

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

 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, 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" } 

Бизнес-логика

 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) })