我有一个带有列标题的表格:| _id(长)|名称(字符串)| x(整数)| y(整数)|
我想删除表格中名为myName的行。
// In onCreate
dbHelper = new DBAdapter(this);
dbHelper.open()
// Function in DBAdapter class
public boolean deleteTitleGivenName(String myName)
{
return dbHelper.delete(DATABASE_TABLE_2, KEY_NAME + "=" + myName, null) > 0;
}
// Function call in java code
dbHelper.deleteTitleGivenName(myName); // this is where my code fails
dbHelper.close();
正如笔记:myName肯定在数据库中。此外,我无法使用ROWID,因为我从ListView获取myName。
我刚开始用Android编程,我已经尝试了好几天来解决这个问题。 我的WHERE子句是否正确(KEY_NAME +“=”+ myName)?
提前致谢。
答案 0 :(得分:38)
当然,这有效,但我会建议
dbHelper.delete(DATABASE_TABLE_2, KEY_NAME + "=?", new String[] { myName })
出于安全原因。这样,您可以拥有特殊字符而不会破坏您的查询。这不起作用吗?
答案 1 :(得分:1)
尝试将where子句的值放在引号...
中KEY_NAME + "='" + myName + "'"
此外,(通常)使用基于字符串的WHERE子句是不好的做法。这是因为如果我的名字中包含撇号,那么您的应用程序将无效。您可能应该寻找另一种方法从Android上的数据库中删除记录。
答案 2 :(得分:0)
取决于where条件的复杂程度,“删除”方法不是最佳解决方案。
例如,如果要删除“_id”在第二个表中的所有记录,就像你在transactSQL中写的那样:“... WHERE _id IN(SELECT _id FROM ...”那么最好的解决方案可能是直接在您的数据库上使用“.execSQL()”方法。
myDatabase.execSQL("DELETE FROM myTable WHERE _id IN (SELECT _id FROM myOtherTable)");
或者你可能会变得非常丑陋并做类似的事情:
int cursorRows = cursor.getCount();
String[] id2String = new String[cursorRows];
String id2StringUnique = "";
//for (int i=0;i<cursorRows;i++) {
int i=0;
for(cursor.moveToFirst(); !(cursor.isAfterLast()); cursor.moveToNext()){
id2String[i] = String.valueOf(cursor.getLong(index_ID));
if (i==0) {
id2StringUnique = "'"+id2String[i]+"'";
} else {
id2StringUnique += ",'"+id2String[i]+"'";
}
i++;
}
dbHelper.delete(DATABASE_TABLE_2, "_id IN (", id2StringUnique +")");
根据项目数量的不同,你可能会对你的论点的长度/大小产生问题 - 除了它是最不利的。
答案 3 :(得分:0)
试试这个简单的代码
private void deleteItem()
{
try
{
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
db.delete(TABLE_NAME, " title = 'haiyang'", null);
setTitle("title");
} catch (SQLException e) {
}