Android Sqlite 数据库 db.exec() 在 SQL 文本中返回语法错误

Posted

技术标签:

【中文标题】Android Sqlite 数据库 db.exec() 在 SQL 文本中返回语法错误【英文标题】:Android Sqlite Database db.exec() is returning syntax error in the SQL text 【发布时间】:2021-10-08 15:58:37 【问题描述】:

我正在使用 SQLiteOpenHelper 为我的 android 应用程序创建一个 SQLite 数据库。当我运行一个函数来更新数据库中的数据 ( db.exec(....) ) 时,我收到一个语法错误,并显示以下消息:

E/SQLiteLog: (1) "VARCHAR" 附近: "INSERT INTO" 中的语法错误 Switch_Database (Switch_Name VARCHAR, Switch_Status INTEGER) 值 (“SpotifySwitch”,1)

我确定这只是一个小的语法错误,但我花了很多时间并无法找出答案。我将不胜感激。

函数如下:

fun changeSwitchValue(switchName: String, status: Int) 
        val db: SQLiteDatabase = this.writableDatabase
        db.execSQL(
            "INSERT INTO $TABLE_NAME ($SWITCH_TABLE_NAME_COLUMN VARCHAR, $SWITCH_TABLE_ISCHECKED_COLUMN INTEGER) VALUES ('$switchName', $status)"
        )
        Log.i(TAG, "Active Switches array now is: $queryActiveSwitches()")
    

这是我上面的本地值:

private val TABLE_NAME = "Switch_Database"
    private val SWITCH_TABLE_NAME_COLUMN = "Switch_Name"
    private val SWITCH_TABLE_ISCHECKED_COLUMN = "Switch_Status"
    private val TAG = "DatabaseHelper"

还有我的创建函数:

override fun onCreate(db: SQLiteDatabase?) 
    if(db != null) 
        //called when db created for the first time
        val sql =
            "CREATE TABLE $TABLE_NAME (switch_id INTEGER PRIMARY KEY AUTOINCREMENT, $SWITCH_TABLE_NAME_COLUMN VARCHAR(20) NOT NULL, $SWITCH_TABLE_ISCHECKED_COLUMN INTEGER)"
        db.execSQL(sql)
        addBasicData(db)
        return
    
    Log.i(TAG,"DB is null in OnCreate() function")

【问题讨论】:

第一个代码块(changeSwitchValue 函数)是调用错误的地方。它说“靠近 VARCHAR” 【参考方案1】:

INSERT 语句中删除数据类型:

fun changeSwitchValue(switchName: String, status: Int) 
    val db: SQLiteDatabase = this.writableDatabase
    db.execSQL(
        "INSERT INTO $TABLE_NAME ($SWITCH_TABLE_NAME_COLUMN, $SWITCH_TABLE_ISCHECKED_COLUMN) VALUES ('$switchName', $status)"
    )
    Log.i(TAG, "Active Switches array now is: $queryActiveSwitches()")

但是,向表中插入新行的推荐且安全的方法是insert()ContentValues

fun changeSwitchValue(switchName: String, status: Int) 
    val db: SQLiteDatabase = this.writableDatabase
    val values = ContentValues().apply 
        put(SWITCH_TABLE_NAME_COLUMN, switchName)
        put(SWITCH_TABLE_ISCHECKED_COLUMN, status)
    
    db.insert(TABLE_NAME, null, values)
    Log.i(TAG, "Active Switches array now is: $queryActiveSwitches()")
 

【讨论】:

以上是关于Android Sqlite 数据库 db.exec() 在 SQL 文本中返回语法错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在Android设备中用NDK编译SQLite并且对SQLite进行操作

Android SQLite使用

Android SQLite详解

Android SQLite详解

Android数据库代码优化 - 从SQLite说起

android 怎么查看sqlite数据库