在给定一个列值的情况下删除数据库表中的行 - 这是一个字符串

时间:2010-07-22 22:57:31

标签: android

我有一个带有列标题的表格:| _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)?

提前致谢。

4 个答案:

答案 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) {

    }