android - 为什么我们在 SqLite 中读取内容时说 id,但在创建/更新/删除行时说 'id'?
问题描述
我正在创建一个笔记应用程序。用户可以输入一个注释,它将被保存到数据库/显示在屏幕上。
我有一个包含所有 CRUD 方法(创建、读取、更新、删除)的 DatabaseHelper 类。
当我更新表格中的特定注释时,我必须这样做:
db.update("Note", contentValues, "id='"+id+"'", null)
'' 围绕用户的 ID。
但是,当我查询阅读笔记时,我不必包含“”:
String fetchOneNote = "SELECT * FROM Note WHERE id="+id;
这有什么具体原因吗?似乎在两者中,我指的是数据库,那么为什么我需要''?
谢谢!
解决方案
无需将数字文字括在单引号中,但字符串文字需要单引号。
因此,如果 id 是数字,则无需将其括在单引号中。但是,将数字文字括在引号中并没有什么坏处。
因此假设id是数字然后: -
db.update("Note",contentValues,"id=" + id,null)
将有效地工作: -
db.update("Note", contentValues, "id='"+id+"'", null)
但是,SQLiteDatabaseupdate
方法的推荐使用是使用第 4 个参数作为 where 子句参数,以防止 SQLite 注入。因此,最好使用:-
db.update("Note",contentValues,"id=?",new String[]{id});
SQLite 解析器然后适当地处理id,替换? 具有价值并防止 SQLite 注入。
请参阅https://sqlite.org/lang_expr.html#literal_values_constants _ 以及https://sqlite.org/lang_expr.html#parameters
- 虽然关于绑定参数的解释包括:-
但是因为问号容易数错,所以不鼓励使用这种参数格式。鼓励程序员使用下面的符号格式之一或上面的 ?NNN 格式。
? _ 是常用的。这是
update method
(和其他方法)所期望的。- 这确实意味着有时您可能必须将相同的参数化(绑定)参数与 ? 一起编码两次(就像不使用绑定参数时一样)。
推荐阅读
- azure - Azure 机器学习中的终结点不可使用
- plotly - 突出来源来源的桑基图
- jquery - 未捕获的 ReferenceError:未定义 new_balance
- python - 是否可以更改 folium 中的弹出背景颜色?
- java - 在 BottomNavigationView 中禁用重新选择
- c# - 使我的 MVC Async 控制器方法异步,以便它们可以同时处理
- c - 如何解决:重新编译时出现 -fPIE 错误?
- flutter - Flutter:无法在 Chrome 中以调试模式运行应用程序
- node.js - 如何在 ajax 数据库表列中添加 html 额外代码
- java - 使用 Apache POI 将 zip 文件嵌入或附加到 Excel 中的 XSSF 工作表中