【问题标题】:How to define a not null field for a table of SQLite when I use Anko in Kotlin?在 Kotlin 中使用 Anko 时如何为 SQLite 表定义非空字段?
【发布时间】:2018-11-15 07:58:48
【问题描述】:

我希望在 Kotlin 中使用 Anko 时为 SQLite 的表定义一个非空字段。

但是DBRecordTable.Category to TEXT NOT NULL 出错了,我该如何解决?

代码

  implementation "org.jetbrains.anko:anko-sqlite:$anko_version"

  override fun onCreate(db: SQLiteDatabase) {
        db.createTable( DBRecordTable.TableNAME , true,
            DBRecordTable._ID to INTEGER + PRIMARY_KEY+ AUTOINCREMENT,
            DBRecordTable.Category to TEXT NOT NULL,    //It's wrong
            DBRecordTable.Content to TEXT,
            DBRecordTable.IsFavorite to INTEGER  +DEFAULT("0"),
            DBRecordTable.IsProtected to INTEGER  +DEFAULT("0"),
            DBRecordTable.CreatedDate to INTEGER
        )
    }

【问题讨论】:

  • “错误”是什么意思?它有语法错误?还是运行时?
  • 谢谢!它显示Unresolved reference: NULL,无法编译。

标签: android kotlin android-sqlite anko


【解决方案1】:

通过查看sqlTypes.kt,我们可以发现not null约束定义如下:

val NOT_NULL: SqlTypeModifier = SqlTypeModifierImpl("NOT NULL")

所以你的代码应该是:

override fun onCreate(db: SQLiteDatabase) {
    db.createTable( DBRecordTable.TableNAME , true,
        DBRecordTable._ID to INTEGER + PRIMARY_KEY + AUTOINCREMENT,
        DBRecordTable.Category to TEXT + NOT_NULL,
        DBRecordTable.Content to TEXT,
        DBRecordTable.IsFavorite to INTEGER + DEFAULT("0"),
        DBRecordTable.IsProtected to INTEGER + DEFAULT("0"),
        DBRecordTable.CreatedDate to INTEGER
    )
}

【讨论】:

  • DBRecordTable.Category to TEXT + NOT_NULL可以编译,但是不知道对不对
  • 是的,TEXT + NOT_NULL 是对的。这似乎是正确的。这有什么问题?
【解决方案2】:

我们使用了这几行代码,创建的表格效果很好

private val dbName = THE_PATH +"JSANotes.db"
private val dbTable = "Notes"
private val colId = "Id"
private val colTitle = "Title"
private val colContent = "Content"
private val dbVersion = 1

private val CREATE_TABLE_SQL = "CREATE TABLE IF NOT EXISTS " + dbTable + " (" + colId + " INTEGER PRIMARY KEY," + colTitle + " TEXT, " + colContent + " TEXT NOT NULL);"
private var db: SQLiteDatabase? = null

init {
    val dbHelper = DatabaseHelper(context)
    db = dbHelper.writableDatabase
}

这个网站将帮助解决很多 SQLite 问题LINK

我们不使用 NOT NULL 来代替 NOT NULL

            if(edtContent.text.toString().equals("")){
            error("ENTER Content")
            edtContent.requestFocus()
            return@setOnClickListener
        }

您还可以使用此代码测试 Activity 底部的文本视图中显示的错误消息的长度

        fun error(msg:String){
        object : CountDownTimer(4000, 1000) {
            override fun onTick(millisUntilFinished: Long) {
                tvError.visibility = View.VISIBLE
                tvError.setText(msg)
            }
            override fun onFinish() {
                tvError.visibility = View.INVISIBLE
                tvError.setText("")
            }
        }.start()
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多