在 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 函数而不是 execSQLexcept记录。此外,引用的解释充其量是令人困惑的,因为它暗示插入可能会返回一些数据。

请注意,可能会有一些副作用使insertexecSQL 更好,或者“最佳实践”要求您使用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

SQLite使用

sqlite3_exec读取blob数据

sqlite3_exec读取blob数据

$ bundle exec rake db:reset 命令提升无法删除 db/development.sqlite3

Sqlite DB 文件太大....?