Java 使用查询字符串在Android SQLiteDatabase中进行插入/更新/删除的正确方法是什么?
我一直在看官方文档()和StackOverflow帖子的交叉引用以及实际观察到的行为,这些文档似乎有误导性,可能在几个方面都是错误的 我正在尝试执行参数化查询以插入/更新/删除,就像使用Java 使用查询字符串在Android SQLiteDatabase中进行插入/更新/删除的正确方法是什么?,java,android,sql,sqlite,Java,Android,Sql,Sqlite,我一直在看官方文档()和StackOverflow帖子的交叉引用以及实际观察到的行为,这些文档似乎有误导性,可能在几个方面都是错误的 我正在尝试执行参数化查询以插入/更新/删除,就像使用rawQuery(字符串sql,字符串[]参数)进行选择一样.我需要通过查询而不是使用SQLiteDatabase类上的insert/update/delete方法来完成,因为在许多情况下,查询跨越多个表,并且在任何情况下,我们已经编写了大量的查询,用于我们所有平台上的应用程序(也为SQLite编写),而且最好按
rawQuery(字符串sql,字符串[]参数)进行选择一样.
我需要通过查询而不是使用SQLiteDatabase类上的insert/update/delete方法来完成,因为在许多情况下,查询跨越多个表,并且在任何情况下,我们已经编写了大量的查询,用于我们所有平台上的应用程序(也为SQLite编写),而且最好按原样使用它
以下是我发现的困惑/误导:
- 该文件指出,对于
,语句必须而不是以分号结尾,但实际上似乎没有任何区别。这对我来说很重要,因为我们有一个巨大的XML文档,其中充满了我在应用程序中跨多个平台使用的查询,如果可能的话,我希望保持它的相同rawQuery
似乎不适用于插入(是的,我尝试过使用分号和不使用分号)。医生什么也没说。我确实看到它返回了一个游标,我想这可能是一个间接的提示,它只对select有效,但不一定——当它们不是结果集时,它可以简单地返回一个零长度或null游标rawQuery
明确表示它不使用insert,但事实上它使用insertexecSQL(stringsql,Object[]bindArgs)
- 此外,尽管
特别告诉您不要尝试CRUD操作,但其无参数版本不包含此类警告,并且在这方面也可以正常工作(缺点是不允许使用SQL参数)execSQL(String,Object[])
附件: 运行操作系统:安卓4.3 示例查询(哪些有效,哪些无效) 您需要的是用于插入的execSQL()。或者你可以这样做:
ContentValues values = new ContentValues();
values.put ("col1", "foo");
values.put ("cols2", "bar");
getDb().insertOrThrow ("MyTable", null, values);
对于查询,您可以使用rawQuery。您是对的。文档很混乱。总体而言,该设计试图围绕sqlite3 C API提供一个方便的Java包装器。在大多数情况下,如果按照设计人员的预期方式使用它,例如使用CRUD操作的方便方法,它工作正常。但他们还需要提供原始查询方法
execSQL()
和rawQuery()
,用于方便的CRUD方法功能不够强大或根本不适用的情况(CREATE TABLE
等等)。这会导致泄漏的抽象
文档中说,对于rawQuery
,语句不能以分号结尾,但实际上似乎没有任何区别。这对我来说很重要,因为我们有一个巨大的XML文档,其中充满了我在应用程序中跨多个平台使用的查询,如果可能的话,我希望保持它的相同
这些文件很糟糕。事实上,安卓SQLiteDatabase
本身就是如此
rawQuery
似乎不适用于插入(是的,我尝试过使用分号和不使用分号)。医生什么也没说。我确实看到它返回了一个游标,我想这可能是一个间接的提示,它只对select有效,但不一定——当它们不是结果集时,它可以简单地返回一个零长度或null游标
它确实有效,但您需要了解它在本机级别上是如何工作的
将execSQL()
视为运行查询并返回成功或错误代码的
可以将rawQuery()
看作编译查询但尚未运行查询的函数。要实际运行它,请使用光标上的移动到…()
方法之一。把这看作是一个问题。将任何rawQuery()
与moveTo…()
组合实际上会改变数据库
execSQL(stringsql,Object[]bindArgs)
明确表示它不适用于selects,但事实上它确实适用
此外,尽管execSQL(String,Object[])
特别告诉您不要尝试CRUD操作,但其无参数版本不包含此类警告,并且在这方面也可以正常工作(缺点是不允许使用SQL参数)
它适用于所有积垢操作。对于CRUD的R read部分,无法获取所选数据。为什么您认为rawQuery
可以用于非查询操作?查询特别指的是SELECT
operation@ianhanniballake,根据我的经验,“query”通常用于指代准备发送到数据库的任何SQL语句,而不管它是否是SELECT语句。毕竟,它被称为结构化查询语言。所以说“更新查询”很常见。这里有一篇维基百科文章使用了这种说法(搜索“查询”):我这样问是因为Android文档非常清楚,查询只指选择,所以我不确定是什么Android文档让你误入歧途?也许我读错了文档,但我在我的链接中没有看到任何东西
ContentValues values = new ContentValues();
values.put ("col1", "foo");
values.put ("cols2", "bar");
getDb().insertOrThrow ("MyTable", null, values);