我正在使用以下代码从我的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
我在这里做错了什么?
答案 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'。
通过运行查询命令来获取需要删除的记录的主键值,始终可以使用此方法。