首页 > 解决方案 > 在使用 Kotlin 为 SQLite 中的列指定类型时,如何使用一组特定的单词?

问题描述

我正在创建一个数据库,我希望其中一个字段是“经典”或“当前”。如何创建一个包含仅指定其中两个列的表?

override fun onCreate(db: SQLiteDatabase?) {
        val CREATE_SONGS_TABLE = ("CREATE TABLE $SONGS_TABLE_NAME (" +
        "$COLUMN_SONGID INTEGER PRIMARY KEY AUTOINCREMENT," +
        "$COLUMN_SONG_MODE TEXT CHECK ('Classic', 'Current'), +" +
        "")
    }

请忽略错误的括号和所有,一旦我完成数据库,我会正确关闭它们。

标签: androidsqliteandroid-studiokotlin

解决方案


我相信你想要:-

override fun onCreate(db: SQLiteDatabase?) {
    val CREATE_SONGS_TABLE = ("CREATE TABLE $SONGS_TABLE_NAME (" +
    "$COLUMN_SONGID INTEGER PRIMARY KEY," +
    "$COLUMN_SONG_MODE TEXT CHECK ($COLUMN_SONG_MODE = 'Classic' OR $COLUMN_SONG_MODE ='Current'))"
}

但是,它只强制只提供两个值之一。它不会更改不正确的值。也就是说,CHECK是一个约束(规则),如果被破坏将导致约束冲突。尽管您可以使用INSERT OR IGNORE .....并且冲突将被忽略并且不会插入行。

您也可以使用稍微不同但可能更合乎逻辑的:-

override fun onCreate(db: SQLiteDatabase?) {
    val CREATE_SONGS_TABLE = ("CREATE TABLE $SONGS_TABLE_NAME (" +
    "$COLUMN_SONGID INTEGER PRIMARY KEY," +
    "$COLUMN_SONG_MODE TEXT, /*<<<<<<<< comma added*/ CHECK ($COLUMN_SONG_MODE = 'Classic' OR $COLUMN_SONG_MODE ='Current'))"
}
  • 这使得 CHECK 约束成为表级别定义而不是列级别。然而,最终的结果并没有什么不同。
  • 表示添加逗号的注释仅用于表示细微的变化。它可以被移除。
  • 请注意,AUTOINCREMENT 关键字已被删除,它是必需的可能性很小,而且效率低下

    • AUTOINCREMENT 关键字强加了额外的 CPU、内存、磁盘空间和磁盘 I/O 开销,如果不是严格需要,应避免使用。通常不需要它。


推荐阅读