你是对的。该文档令人困惑。总体而言,该设计尝试围绕sqlite3 C
API提供一个方便的Java包装器。在大多数情况下,如果按照设计人员的预期使用它(例如使用CRUD操作的便捷方法),它就可以正常工作。但是,他们还需要提供原始查询方法,
execSQL()以及
rawQuery()在便利性CRUD方法功能不足或根本不适用的情况下(
CREATETABLE等等)。这导致泄漏抽象。
该文档说,
rawQuery该语句不能以分号结尾,但实际上似乎没有任何区别。这对我来说很重要,因为我们有一个巨大的XML文档,其中填充了我在多个平台上的应用程序中使用的查询,并且我希望尽可能保持相同。
该文档是不好的。实际上,Android
SQLiteDatabase本身使用分号终止的查询字符串进行调用
rawQuery。
rawQuery似乎不适用于插入内容(是的,我尝试使用和不使用分号)。这位医生对此一无所知。我确实看到它返回了一个Cursor,我想这可能是一个斜线提示,它仅适用于select,但不一定如此-
当没有结果集时,它可以简单地返回零长度或null的Cursor。
它 确实可以 工作,但是您需要了解它在本机级别如何工作。
想想
execSQL()作为
sqlite3_exec()运行查询,并返回成功或错误代码。
可以认为
rawQuery()它
sqlite3_prepare()可以编译查询但尚未运行它。要实际运行它,请使用上的一种
moveTo...()方法
Cursor。认为这是
sqlite3_step()。结合任何
rawQuery()与
moveTo...()居然会改变数据库。
execSQL(String sql, Object[] bindArgs)明确表示它不适用于选择,但实际上可以!此外,尽管
execSQL(String,Object[])明确告诉您不要尝试CRUD操作,但其无参数版本不包含此类警告,并且也可以正常工作(缺点是不允许使用SQL参数)。
它适用于所有CRUD操作。对于CRUD的R读取部分,根本无法获取所选数据。



