首页 > 解决方案 > 为什么我们在 SqLite 中读取内容时说 id,但在创建/更新/删除行时说 'id'?

问题描述

我正在创建一个笔记应用程序。用户可以输入一个注释,它将被保存到数据库/显示在屏幕上。

我有一个包含所有 CRUD 方法(创建、读取、更新、删除)的 DatabaseHelper 类。

当我更新表格中的特定注释时,我必须这样做:

db.update("Note", contentValues, "id='"+id+"'", null)

'' 围绕用户的 ID。

但是,当我查询阅读笔记时,我不必包含“”:

String fetchOneNote = "SELECT * FROM Note WHERE id="+id;

这有什么具体原因吗?似乎在两者中,我指的是数据库,那么为什么我需要''?

谢谢!

标签: androidsqldatabasesqlite

解决方案


无需将数字文字括在单引号中,但字符串文字需要单引号。

因此,如果 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(和其他方法)所期望的。

    • 这确实意味着有时您可能必须将相同的参数化(绑定)参数与 ? 一起编码两次(就像不使用绑定参数时一样)。

推荐阅读