SQLite DELETE无法正常工作

时间:2012-02-28 17:49:14

标签: java android sql database sqlite

我正在使用以下代码从我的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

我在这里做错了什么?

5 个答案:

答案 0 :(得分:2)

(除非您处于自动提交模式),您是否提交了交易?

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

答案 1 :(得分:0)

我想你需要围绕参数值使用单引号,或使用绑定变量(首选)。

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

答案 2 :(得分:0)

使用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)});

答案 3 :(得分:0)

如果要使用SQL语句编写数据库,请使用 execSql()方法代替rawQuery()

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

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

答案 4 :(得分:0)

我遇到了类似的问题,当我在DELETE命令的WHERE子句中使用主键时问题得到了解决。在我的情况下,我有两列(一起)被设置为主键,所以我不得不使用WHERE column1 ='value1'和column2 ='value2'。

通过运行查询命令来获取需要删除的记录的主键值,始终可以使用此方法。