簡體   English   中英

在使用 Kotlin 為 SQLite 中的列指定類型時,如何使用一組特定的詞?

[英]How do I use a specific set of words when specifying types for columns in SQLite, using Kotlin?

我正在制作一個數據庫,我希望其中一個字段是“經典”或“當前”。 如何創建一個包含僅指定其中兩個列的表?

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'), +" +
        "")
    }

請忽略錯誤的括號和所有內容,我將在完成數據庫后正確關閉它們。

我相信你想要:-

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 開銷,如果不是絕對需要,應該避免使用。 通常不需要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM