【问题标题】:How do I fix the syntax error on an INSERT INTO command?如何修复 INSERT INTO 命令的语法错误?
【发布时间】:2016-06-16 06:59:26
【问题描述】:

onClick() 事件中,我尝试使用 INSERT INTO 命令将 SQLite 数据库表 (TOTALCOUNT) 中我的 CARDNUM 列中的计数器值增加 1。

尝试运行时出现错误:

 db.execSQL(INCREMENT_COUNT2);

Android Studio 给出以下错误信息

"SQLiteException: near "cardnum": syntax error (code 1): , while compiling: INSERT INTO totalcount(cardnum) VALUES cardnum+1"

我在这里错过了什么?
有没有更好的方法来实现插入时的增量?

DatabaseHelper.java 文件:

// Increment the counter in the TOTALCOUNT Table in the database.
public void insertIntoTableTOTALCOUNT() {

    // Get a reference to a writable DB
    SQLiteDatabase db = this.getWritableDatabase();

    db.beginTransaction();

    db.execSQL(INCREMENT_COUNT1);
    db.execSQL(INCREMENT_COUNT2);

    db.setTransactionSuccessful();
    db.endTransaction();

    if(db.isOpen())
        db.close();
    }

// Set the counter to a default value of zero.
public static final String INCREMENT_COUNT1 = " INSERT OR IGNORE INTO " + TABLE_NAME_TOTALCOUNT +
    "(" + COLUMN_NAME_CARDNUM+")" + " VALUES (0)";

// Increment the Cardnum count by +1 for each onClick.
public static final String INCREMENT_COUNT2 = "INSERT INTO " + TABLE_NAME_TOTALCOUNT + "(" + COLUMN_NAME_CARDNUM+") VALUES " + COLUMN_NAME_CARDNUM +"+1";

【问题讨论】:

    标签: android sqlite android-sqlite sql-insert


    【解决方案1】:

    这是正确的 SQL 命令:

    public static final String INCREMENT_COUNT2 = "INSERT INTO " + TABLE_NAME_TOTALCOUNT + "(" + COLUMN_NAME_CARDNUM + ") VALUES (" + (COLUMN_NAME_CARDNUM + 1) + ")";
    

    但使用绑定参数会是更好的选择。

    【讨论】:

    • 我会试试的。我从来没有使用过绑定参数。这是为了尽量减少 SQL 注入吗?你能指出任何好的链接,帮助我了解使用它们的优势吗?
    • 是的,但不仅如此。它还使您无需将字符串括在引号中或双撇号。供参考:stackoverflow.com/questions/9857073/…
    【解决方案2】:

    如果我正确理解了您的问题,我认为您想用 +1 更新 COLUMN_NAME_CARDNUM 的值,而不是插入新行。如果这是正确的,你的陈述应该是

    UPDATE TABLE_NAME_TOTALCOUNT SET COLUMN_NAME_CARDNUM=COLUMN_NAME_CARDNUM+1 WHERE <filter criteria>
    

    如果您确实想用 COLUMN_NAME_CARDNUM+1 插入一个新行,那么您必须从 DB 中获取 COLUMN_NAME_CARDNUM 的 MAX,然后将其递增并插入

    SELECT MAX(COLUMN_NAME_CARDNUM) FROM TABLE_NAME_TOTALCOUNT
    

    然后将其加 1 并插入。

    【讨论】:

    • 我希望插入一个带有 +1 的新行。所以我想取最后一个先前插入的行的值并添加一个。那么您是否建议我使用您的 SELECT MAX 示例?
    • 是的,正确。我不知道 COLUMN_NAME_CARDNUM 的确切逻辑,但如果它应该比最后插入的行 +1(因此是唯一的),那么您应该先选择 MAX,然后增加该值,然后再插入。
    • 好的,我试试看。
    • 另外,如果 CARDNUM 应该是唯一的,您可以考虑将其设置为具有自动增量的 PK - CREATE TABLE TABLE_NAME_TOTALCOUNT(COLUMN_NAME_CARDNUM INTEGER PRIMARY KEY AUTOINCREMENT);
    【解决方案3】:

    使一个方法通过增加或增加 1 来传递 Cardnum 值。然后运行插入查询。插入有两种类型的 SQL 查询。

    1. 原始查询,即字符串 insertdata= "INSERT INTO " + TABLE_NAME_TOTALCOUNT + "(" + COLUMN_NAME_CARDNUM+") VALUES " + COLUMN_NAME_CARDNUM +"+1";

    2. 另一个是使用 ContentValues:

      public void insertDatatoDatabase(String data1,String data2){ ContentValues values = new ContentValues(); values.put(COLUMN1, data1); values.put(COLUMN2, data2);db1.insert(TABLE_DETAIL, null, values); }

    您在字符串“”中添加 +1,它是一个整数。尝试将它们添加到括号中或在插入之前添加数字并仅从 onclick 发送。

    【讨论】:

      【解决方案4】:
       public static final String INCREMENT_COUNT2 = "INSERT INTO " + TABLE_NAME_TOTALCOUNT + "(" + COLUMN_NAME_CARDNUM+") VALUES (" + (COLUMN_NAME_CARDNUM=COLUMN_NAME_CARDNUM+1)+")";
      

      //使用这个可能会奏效

      【讨论】:

      • 错误消息:“无法为最终变量 'COLUMN_NAME_CARDNUM' 赋值。
      • "无法为最终变量 'COLUMN_NAME_CARDNUM' 赋值。
      【解决方案5】:

      不应该

      INCREMENT_COUNT2 = "INSERT INTO " + TABLE_NAME_TOTALCOUNT + "(" + COLUMN_NAME_CARDNUM+") VALUES (" + COLUMN_NAME_CARDNUM +"+1)"
      

      【讨论】:

      • 应用程序崩溃并显示错误消息:“没有这样的列:cardnum (code 1): , while compile: INSERT INTO totalcount(cardnum) VALUES (cardnum+1)”
      猜你喜欢
      • 1970-01-01
      • 2016-09-06
      • 2020-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多