android - 在使用 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'), +" +
"")
}
请忽略错误的括号和所有,一旦我完成数据库,我会正确关闭它们。
解决方案
我相信你想要:-
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 开销,如果不是严格需要,应避免使用。通常不需要它。
推荐阅读
- r - 为什么函数和条件语句会给出错误的输出?
- oracle - 在 oracle apex 中动态设置 pl/sql 代码
- mongodb - MongoDB:无法解析 $convert 中的 objectId '',没有 onError 值:解析为 OID 的字符串长度无效,预期为 24,但发现为 0
- c# - 通过鼠标单击跳转到选定的对象
- bash - 如何在 Slurm 中使用用户输入
- python - 如何根据 2 个数据框之间的通用列表元素分配列值
- google-bigquery - 语法错误:应为“)”,但在 [62:23] 获得标识符“ciclos”
- c++ - 将 NORMAL 添加到 inputLayout 时出错
- task - 工作流无法启动,因为没有在工作流任务列表中插入记录
- reactjs - 如何使用 ansbile 为 nginx 构建 reactjs 文件,然后将这些文件同步到 ansible 库存?