【问题标题】:SQLite DELETE not workingSQLite DELETE 不起作用
【发布时间】:2012-02-28 17:49:13
【问题描述】:

我正在使用以下代码从我的 SQLite 表中删除某些行。

                if (!cfile.exists()) {// remove invalid db files
                    database.rawQuery("DELETE FROM "
                            + DataBaseHelper.VFS_DATABASE_TABLE + " WHERE "
                            + DataBaseHelper.VIRTUAL_SYSTEM_COLUMN_PATH // TODO
                                                // not
                                                // removing
                                                // properly
                            + " IS ?", new String[] { pathcursora.getString(0) });
                    System.out.println("DELETE FROM "
                            + DataBaseHelper.VFS_DATABASE_TABLE + " WHERE "
                            + DataBaseHelper.VIRTUAL_SYSTEM_COLUMN_PATH
                            + " IS "+pathcursora.getString(0));
                }

但是这些行没有被删除。下面的堆栈跟踪:

02-28 23:13:27.564: D/NameManager.java(7098): Checking for whatever
02-28 23:13:27.587: I/System.out(7098): 1 : /mnt/sdcard/fsimages87
02-28 23:13:27.587: I/System.out(7098): 2 : /mnt/sdcard/fsimages3
02-28 23:13:27.595: I/System.out(7098): Invalid db entry for /mnt/sdcard/fsimages3 removed.
02-28 23:13:27.595: I/System.out(7098): 3 : /mnt/sdcard/fsimages2
02-28 23:13:27.603: I/System.out(7098): Invalid db entry for /mnt/sdcard/fsimages2 removed.
02-28 23:13:27.603: I/System.out(7098): 4 : /mnt/sdcard/fsimages1
02-28 23:13:27.603: I/System.out(7098): Invalid db entry for /mnt/sdcard/fsimages1 removed.
02-28 23:13:27.603: I/System.out(7098): 5 : /mnt/sdcard/fsimages
02-28 23:13:46.603: D/NameManager.java(7098): Checking for whatever
02-28 23:13:46.618: I/System.out(7098): 1 : /mnt/sdcard/fsimages87
02-28 23:13:46.618: I/System.out(7098): 2 : /mnt/sdcard/fsimages3
02-28 23:13:46.626: I/System.out(7098): Invalid db entry for /mnt/sdcard/fsimages3 removed.
02-28 23:13:46.626: I/System.out(7098): 3 : /mnt/sdcard/fsimages2
02-28 23:13:46.626: I/System.out(7098): Invalid db entry for /mnt/sdcard/fsimages2 removed.
02-28 23:13:46.626: I/System.out(7098): 4 : /mnt/sdcard/fsimages1
02-28 23:13:46.634: I/System.out(7098): Invalid db entry for /mnt/sdcard/fsimages1 removed.
02-28 23:13:46.634: I/System.out(7098): 5 : /mnt/sdcard/fsimages

我在这里做错了什么?

【问题讨论】:

  • 回应你的查询语句,看看它的样子
  • @trapper ECHO : DELETE FROM vs_table WHERE vspath IS /mnt/sdcard/fsimages1

标签: java android sql database sqlite


【解决方案1】:

(除非您处于自动提交模式)您是否正在提交您的事务?

您是否检查过您的 SQL 语句的准确性?

【讨论】:

  • 不知道什么意思,我只是学sql。如何提交此交易?
  • ECHO : DELETE FROM vs_table WHERE vspath IS /mnt/sdcard/fsimages1 vspath 和 entry "/mnt/sdcard/fsimages1" 都存在
【解决方案2】:

我想您需要在参数值周围加上单引号,或者使用绑定变量(首选)。

DELETE FROM vs_table WHERE vspath IS '/mnt/sdcard/fsimages1';

【讨论】:

    【解决方案3】:

    使用 delete() 函数代替 rawQuery 来实现安全的参数化查询:

    DbHelper hDbHelper = ...;
    SQLiteDatabase hDB;
    hDB = hDbHelper.getWritableDatabase();
    
    hDB.delete (DataBaseHelper.VFS_DATABASE_TABLE, 
            String.format("%s = ?",DataBaseHelper.VIRTUAL_SYSTEM_COLUMN_PATH),
            new String[] {pathcursora.getString(0)});
    

    【讨论】:

      【解决方案4】:

      如果你想用SQL语句写数据库,不如用execSql()方法代替rawQuery()

      rawQuery() 函数可以执行 Select,并返回包含查询结果的 Cursor,但这不能写入数据库。

      execSql() 函数没有返回值!如果删除成功很重要,请使用 delete() 方法。

      【讨论】:

        【解决方案5】:

        我遇到了类似的问题,当我在 DELETE 命令的 WHERE 子句中使用主键时,问题得到了解决。就我而言,我将两列(一起)设置为主键,所以我必须使用 WHERE column1 = 'value1' AND column2 = 'value2'。

        这种方法总是可以通过运行查询命令来获取需要删除的记录的主键值来实现的。

        【讨论】:

          猜你喜欢
          • 2011-12-20
          • 1970-01-01
          • 2018-07-19
          • 2014-09-28
          • 1970-01-01
          • 2012-11-16
          • 2014-10-25
          • 2012-10-04
          • 2018-01-21
          相关资源
          最近更新 更多