【发布时间】:2013-11-21 00:45:47
【问题描述】:
我一直在查看官方文档 (http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html) 并与 StackOverflow 帖子和实际观察到的行为进行交叉引用,并且该文档似乎具有误导性,并且在几个方面可能只是错误的。
我正在尝试执行参数化查询以插入/更新/删除,就像使用rawQuery(String sql, String[] arguments). 进行选择一样,我需要通过查询而不是使用 SQLiteDatabase 上的插入/更新/删除方法来执行此操作类,因为在许多情况下,查询跨越多个表,并且在任何情况下,我们都编写了一大组查询,用于我们所有平台上的这个应用程序(也为 SQLite 编写),并且最好将它用作 -是。
以下是我认为令人困惑/误导的内容:
文档说
rawQuery的语句必须不以分号结尾,但实际上似乎没有任何区别。这对我来说很重要,因为我们有一个巨大的 XML 文档,其中填充了我在多个平台的应用中使用的查询,如果可能的话,我希望保持相同。rawQuery似乎不适用于插入(是的,我尝试过使用和不使用分号)。医生没有说这件事。我确实看到它返回了一个游标,我想这可能是一个暗示,它只适用于一个选择,但不一定——当它们没有结果集时,它可以简单地返回一个零长度或空游标。execSQL(String sql, Object[] bindArgs)明确表示它确实不适用于插入,但实际上它可以!此外,尽管
execSQL(String, Object[])明确告诉您不要尝试 CRUD 操作,但其无参数版本不包含此类警告,并且也可以正常工作(缺点是不允许使用 SQL 参数)。
所有这一切的结果是,我能找到成功执行带有参数化参数的插入的唯一方法是使用文档明确指示您不使用的一种工作方法为此目的。
另外,rawQuery 不能用于插入/更新/删除,这真是令人遗憾,因为我们有一个通用的数据层,如果我们可以使用一个统一的 API 调用来运行我们所有的 CRUD,那就更优雅了查询数据库。
那么这里发生了什么?该文档是否已经过时了?用 execSql 做插入、更新等可以吗?有没有人成功使用 rawQuery 进行插入?
附录:
针对操作系统运行:Android 4.3。
示例查询(什么有效,什么无效)
// Works
db.execSql("INSERT into MyTable (Col1, Col2) VALUES (?, ?)", new String[] { "Foo", "Bar" });
db.execSql("INSERT into MyTable (Col1, Col2) VALUES (?, ?);", new String[] { "Foo", "Bar" });
// No exception thrown, but no changes made to the database
db.rawQuery("INSERT into MyTable (Col1, Col2) VALUES (?, ?)", new String[] { "Foo", "Bar" });
db.rawQuery("INSERT into MyTable (Col1, Col2) VALUES (?, ?);", new String[] { "Foo", "Bar" });
【问题讨论】:
-
为什么你认为
rawQuery可以用于非查询操作?查询特指SELECT操作 -
@ianhanniballake,根据我的经验,“查询”通常用于指代任何准备发送到数据库的 SQL 语句,无论它是否是 SELECT。毕竟,它被称为结构化查询语言。所以说“更新查询”是很常见的。这是使用此措辞的维基百科文章(搜索“查询”):en.wikipedia.org/wiki/Update_%28SQL%29
-
我问是因为 Android 文档非常清楚,查询仅指 SELECT,所以我不确定是什么 Android 文档让您误入歧途?
-
也许我正在阅读错误的文档,但我在发布的链接中没有看到任何内容表明您只能在 rawQuery 中运行 SELECT。相反,它明确表示您不能在 execSQL 中执行 CRUD 操作。那么你还会在哪里做呢?
-
您好,如何知道插入成功?