更新 sqlite 数据库时未发现此类列错误
No such column found error while updating sqlite database
我正在使用以下代码更新我的 SQLite 数据库。
fun updateTable(user: Users):Int{
val db=this.writableDatabase
val values=ContentValues().apply {
put(USER_ID,user.userId)
put(USER_NAME,user.name)
put(USER_NUMBER,user.number)
put(USER_STATUS,user.status)
put(USER_IMAGE,user.image)
put(ANY_MESSAGE_MADE,user.anyMessageMade)
}
val newRowId = db?.update(TABLE_NAME,values, USER_ID+ "="+user.userId,null)!!
db.close()
return newRowId
}
但是我的日志和程序中出现了这个错误
E/SQLiteLog: (1) no such column: vV91XjGEgzIpV3235aYS
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.russvkm.chathut, PID: 4421
android.database.sqlite.SQLiteException: no such column: vV91XjGEgzIpV3235aYS (code 1): , while compiling: UPDATE contact_entry SET name=?,user_status=?,anyMessageMade=?,userId=?,user_image=?,user_number=? WHERE userId=vV91XjGEgzIpV3235aYS
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:890)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:501)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
at android.database.sqlite.SQLiteDatabase.updateWithOnConflict(SQLiteDatabase.java:1651)
at android.database.sqlite.SQLiteDatabase.update(SQLiteDatabase.java:1599)
at com.russvkm.chathut.utils.CreateContact.updateTable(CreateContact.kt:78)
at com.russvkm.chathut.fragment.ChatFragment.onClick(ChatFragment.kt:89)
at android.view.View.performClick(View.java:6294)
at android.view.View$PerformClick.run(View.java:24770)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
用户 ID 和 table 条目可用,我正在尝试更新。
我正在尝试使用主键 userId
更新 table
当您将变量 user.userId
传递给 update()
方法的 WHERE
子句时,变量 user.userId
的值应该在单引号内。
所以代码应该是:
db?.update(TABLE_NAME,values, USER_ID + " = '" + user.userId + "'", null)!!
但正确且安全的方法是在 WHERE
子句中使用 ?
占位符,并在 update()
的第 4 个参数中传递参数值:
db?.update(TABLE_NAME, values, USER_ID + " = ?", arrayOf(user.userId))!!
但是在你的代码中还有这一行:
put(USER_ID,user.userId)
为什么要使用已有的相同值更新列 userId
?
还有方法 update()
returns 更新的行数而不是任何新的 rowid
.
那么这一行的重点是什么:
val newRowId = db?.update(TABLE_NAME,values, USER_ID+ "="+user.userId,null)!!
这让我觉得也许您想在 table 中插入一个新行而不更新现有行。
如果是这种情况,那么您应该使用方法 insert()
:
val newRowId = db?.insert(TABLE_NAME, null, values)!!
我正在使用以下代码更新我的 SQLite 数据库。
fun updateTable(user: Users):Int{
val db=this.writableDatabase
val values=ContentValues().apply {
put(USER_ID,user.userId)
put(USER_NAME,user.name)
put(USER_NUMBER,user.number)
put(USER_STATUS,user.status)
put(USER_IMAGE,user.image)
put(ANY_MESSAGE_MADE,user.anyMessageMade)
}
val newRowId = db?.update(TABLE_NAME,values, USER_ID+ "="+user.userId,null)!!
db.close()
return newRowId
}
但是我的日志和程序中出现了这个错误
E/SQLiteLog: (1) no such column: vV91XjGEgzIpV3235aYS
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.russvkm.chathut, PID: 4421
android.database.sqlite.SQLiteException: no such column: vV91XjGEgzIpV3235aYS (code 1): , while compiling: UPDATE contact_entry SET name=?,user_status=?,anyMessageMade=?,userId=?,user_image=?,user_number=? WHERE userId=vV91XjGEgzIpV3235aYS
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:890)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:501)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
at android.database.sqlite.SQLiteDatabase.updateWithOnConflict(SQLiteDatabase.java:1651)
at android.database.sqlite.SQLiteDatabase.update(SQLiteDatabase.java:1599)
at com.russvkm.chathut.utils.CreateContact.updateTable(CreateContact.kt:78)
at com.russvkm.chathut.fragment.ChatFragment.onClick(ChatFragment.kt:89)
at android.view.View.performClick(View.java:6294)
at android.view.View$PerformClick.run(View.java:24770)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
用户 ID 和 table 条目可用,我正在尝试更新。
我正在尝试使用主键 userId
更新 table当您将变量 user.userId
传递给 update()
方法的 WHERE
子句时,变量 user.userId
的值应该在单引号内。
所以代码应该是:
db?.update(TABLE_NAME,values, USER_ID + " = '" + user.userId + "'", null)!!
但正确且安全的方法是在 WHERE
子句中使用 ?
占位符,并在 update()
的第 4 个参数中传递参数值:
db?.update(TABLE_NAME, values, USER_ID + " = ?", arrayOf(user.userId))!!
但是在你的代码中还有这一行:
put(USER_ID,user.userId)
为什么要使用已有的相同值更新列 userId
?
还有方法 update()
returns 更新的行数而不是任何新的 rowid
.
那么这一行的重点是什么:
val newRowId = db?.update(TABLE_NAME,values, USER_ID+ "="+user.userId,null)!!
这让我觉得也许您想在 table 中插入一个新行而不更新现有行。
如果是这种情况,那么您应该使用方法 insert()
:
val newRowId = db?.insert(TABLE_NAME, null, values)!!