当我在 Kotlin 中使用 Anko 时,如何为 SQLite 的 table 定义一个非空字段?
How to define a not null field for a table of SQLite when I use Anko in Kotlin?
希望在Kotlin中使用Anko时为SQLite的table定义一个not null字段
但是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
)
}
通过查看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
)
}
我们使用了这些代码行并且效果很好 table created
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()
}
希望在Kotlin中使用Anko时为SQLite的table定义一个not null字段
但是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
)
}
通过查看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
)
}
我们使用了这些代码行并且效果很好 table created
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
}
您还可以使用此代码
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()
}