Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用查询字符串在Android SQLiteDatabase中进行插入/更新/删除的正确方法是什么?_Java_Android_Sql_Sqlite - Fatal编程技术网

Java 使用查询字符串在Android SQLiteDatabase中进行插入/更新/删除的正确方法是什么?

Java 使用查询字符串在Android SQLiteDatabase中进行插入/更新/删除的正确方法是什么?,java,android,sql,sqlite,Java,Android,Sql,Sqlite,我一直在看官方文档()和StackOverflow帖子的交叉引用以及实际观察到的行为,这些文档似乎有误导性,可能在几个方面都是错误的 我正在尝试执行参数化查询以插入/更新/删除,就像使用rawQuery(字符串sql,字符串[]参数)进行选择一样.我需要通过查询而不是使用SQLiteDatabase类上的insert/update/delete方法来完成,因为在许多情况下,查询跨越多个表,并且在任何情况下,我们已经编写了大量的查询,用于我们所有平台上的应用程序(也为SQLite编写),而且最好按

我一直在看官方文档()和StackOverflow帖子的交叉引用以及实际观察到的行为,这些文档似乎有误导性,可能在几个方面都是错误的

我正在尝试执行参数化查询以插入/更新/删除,就像使用
rawQuery(字符串sql,字符串[]参数)进行选择一样.
我需要通过查询而不是使用SQLiteDatabase类上的insert/update/delete方法来完成,因为在许多情况下,查询跨越多个表,并且在任何情况下,我们已经编写了大量的查询,用于我们所有平台上的应用程序(也为SQLite编写),而且最好按原样使用它

以下是我发现的困惑/误导:

  • 该文件指出,对于
    rawQuery
    ,语句必须而不是以分号结尾,但实际上似乎没有任何区别。这对我来说很重要,因为我们有一个巨大的XML文档,其中充满了我在应用程序中跨多个平台使用的查询,如果可能的话,我希望保持它的相同

  • rawQuery
    似乎不适用于插入(是的,我尝试过使用分号和不使用分号)。医生什么也没说。我确实看到它返回了一个游标,我想这可能是一个间接的提示,它只对select有效,但不一定——当它们不是结果集时,它可以简单地返回一个零长度或null游标

  • execSQL(stringsql,Object[]bindArgs)
    明确表示它不使用insert,但事实上它使用insert

  • 此外,尽管
    execSQL(String,Object[])
    特别告诉您不要尝试CRUD操作,但其无参数版本不包含此类警告,并且在这方面也可以正常工作(缺点是不允许使用SQL参数)

所有这些的结果是,我能找到的成功执行带有参数化参数的插入的唯一方法是使用一种工作方法,文档明确指示您不要使用该方法。

另外,rawQuery不能用于插入/更新/删除,这真是一个遗憾,因为我们有一个通用的数据层,如果我们可以使用一个统一的API调用在数据库上运行所有CRUD查询,这将更加优雅

这是怎么回事?这份文件过时了吗?可以使用execSql进行插入、更新等操作吗?是否有人成功地使用rawQuery执行插入操作


附件:

运行操作系统:安卓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);