在 Android SQLite 中使用 execSQL 进行 INSERT 操作
Posted
技术标签:
【中文标题】在 Android SQLite 中使用 execSQL 进行 INSERT 操作【英文标题】:Using execSQL for INSERT operation in Android SQLite 【发布时间】:2012-05-09 15:30:08 【问题描述】:从the documentation 和this post 我知道execSQL()
执行一个不是SELECT
或任何其他返回数据的SQL 语句的SQL 语句。还提到execSQL()
不应该用于插入。
但我使用execSQL()
插入类似:
db.execSQL("INSERT INTO LIST VALUES('খবর');"); //where LIST is a table
这对我来说非常有效(没有SELECT
声明与此INSERT
),但我被告知不要使用此here。
所以,我的问题是:即使没有附加SELECT
语句,INSERT
语句是否返回值?
【问题讨论】:
尝试添加双引号(“খবর”) 用代码blazin.in/2016/02/understanding-sqlite-database-in-android.html试试这个例子 【参考方案1】:您可以使用它,只是不推荐,因为您不会收到任何可能由数据库生成的信息。您应该使用返回代码/光标/其他信息的方法让您知道发生了什么,以便在出现问题时进行处理。
关键是execSQL
文档中的这一行:
It has no means to return any data (such as the number of affected rows). Instead, you're encouraged to use insert...
那里的重要词是“鼓励”。您可以将execSQL
用于任何 SQL 命令,但您不会获得有关该过程的反馈,这使得将其用于您应该获得反馈的东西是相当危险的(除非您不关心而不是插入失败,或者 5 条记录中只有 2 条被更新)。
【讨论】:
【参考方案2】:INSERT
语句不返回结果集,至少在 Sqlite 中不返回。
Android 文档中提到了 execSQL
:
执行不是 SELECT 或任何其他 SQL 的单个 SQL 语句 返回数据的语句。它无法返回任何数据(例如 作为受影响的行数)。相反,您鼓励使用 插入(字符串,字符串,内容值),更新(字符串,内容值, String、String[]) 等,如果可能的话。
我不是 Android 程序员,但如果我想检索插入的 rowid
,我当然不会被鼓励使用 insert
函数而不是 execSQL
,except记录。此外,引用的解释充其量是令人困惑的,因为它暗示插入可能会返回一些数据。
请注意,可能会有一些副作用使insert
比execSQL
更好,或者“最佳实践”要求您使用insert
。
【讨论】:
是否包含如下 SELECT 语句的 INSERT 语句:INSERT INTO suppliers (supplier_id, supplier_name) SELECT account_no, name FROM customers WHERE city = 'Newark';
返回值?
否; “INSERT INTO .. SELECT ...”是一个 INSERT 语句,就像“INSERT INTO ... VALUES ...”一样。
我认为 SELECT 语句返回的值被 INSERT 语句恕我直言使用。
您询问了INSERT
语句:“INSERT 语句...返回值吗?”
没有。 INSERT 语句不返回值【参考方案3】:
插入操作可以通过以下方式进行
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(KEY_NAME, contact.getName()); // Contact Name
values.put(KEY_PH_NO, contact.getPhoneNumber()); // Contact Phone
// Inserting Row
db.insert(TABLE_CONTACTS, null, values);
//2nd argument is String containing nullColumnHack
db.close(); // Closing database connection
更多信息请参考代码链接 http://www.blazin.in/2016/02/understanding-sqlite-database-in-android.html
【讨论】:
以上是关于在 Android SQLite 中使用 execSQL 进行 INSERT 操作的主要内容,如果未能解决你的问题,请参考以下文章
Dart/Flutter ffi(外部函数接口)本机回调,例如:sqlite3_exec