如何删除SQLite数据库中的特定行

时间:2013-07-29 06:22:15

标签: android android-sqlite sqliteopenhelper sqlite

我是android的新手,我无法理解sqlite数据库中的删除功能。我使用字符串创建了我的数据库

private static final String TABLE_NAME="NameInfo";
    private static final String POSITION_DB ="_id";
    private static final String Name_DB ="name";
    private static final String JSONOBJECT_DB="json";
    private static final String TIMESTAMP_DB="time";
    private static final String USERRATING_DB="userrating";
    private static final String DATABASE_NAME ="database.db";    
private final String createDb ="create table if not exists "+TABLE_NAME +" ("
                + POSITION_DB + " integer primary key, "
                + NAME_DB + " text not null, "
                + JSONOBJECT_DB + " text not null, "
                + USERRATING_DB + " text not null, "
                +TIMESTAMP_DB + " text not null); ";

现在,当我启动我的应用程序时,我希望删除超过2天前添加的所有行

所以我打算做这样的事情

long currentdate =new date().getTime();

然后检查表的每一行的currenttime-Long.Valueof(TIMESTAMP_DB)字段之间的区别,如果它超过2 * 24 * 60 * 60,则删除该行

有人可以告诉我如何使用以下功能来实现上述目标

public int delete (String table, String whereClause, String[] whereArgs)

我不确定我应该在whereClause和whereArgs中写什么。

如果有人能告诉我一个比这更好,更简单的方法,我将非常感激。

PS我也尝试过execSQL语句,但无法编写完整的查询 按database.execSQL("Delete * from "+TABLE_NAME+" WHERE = "+currentdate - Long.ValueOf(?) >2*24*60*60 ;")

提前致谢。

4 个答案:

答案 0 :(得分:2)

你可以使用这样的查询:

db.execSQL("DELETE FROM " + TABLE_NAME +
           " WHERE " + currentdate + " - " + TIMESTAMP_DB + " > 2*24*60*60");

对于update方法,在WHERE参数的whereClause子句中编写SQL表达式;仅对字符串值需要whereArgs

db.update(TABLE_NAME, currentdate + " - " + TIMESTAMP_DB + " > 2*24*60*60", null);

答案 1 :(得分:1)

您也可以这样做::

db.execSQL(String.format("DELETE FROM %s WHERE %s = %d",
                Table_NAME,Table_ColumnName,Integer.parseInt(Value)));

它将直接执行语句。

并且您已经问过WhereClause意味着您要使用的ColumnNames和表达式。并且其中args是String数组,因此您需要传递已编写的Expression的参数值。

db.delete(Table_NAME, ColumnName+" = ", String[]{Value});

答案 2 :(得分:1)

这是一个非常“巨大”的问题,可以根据您的个人要求提供更多的工作方法,例如安全性,性能等。

首先,我建议您使用参数化语句而不是“harcoded”,这些语句不安全且不易读取,因此请使用占位符e.q。

select * from test where id = ?

其次,对于表中的删除行,使用API​​内置函数delete()。正如@Chintan Rathod指出的那样,你的删除声明不是有效声明。

现在回答你的问题。由于您要删除由于指定时间戳而导致的行,我建议您以特定日期格式插入具有指定日期的每一行(您只需使用SimpleDateFormat。然后有更多方法可以执行此操作。我首先更喜欢查询表并放置简单如果条件如果实际日期和存储在行中的日期之间存在差异2天,则保存他的rowId。最后,您要删除要删除的行ID。

但是,现在您还不知道要删除多少行,因此您需要:

  1. 删除循环中的记录(API小于11)
  2. 使用IN子句
  3. 创建动态查询
  4. 从Android API 11开始,有一种方法可以删除多条记录。在这里,您可以根据ID的大小创建“动态”语句(存储在某个动态数组中)。
  5. 示例:

    第一种方法:

    List<Integer> ids = new ArrayList<Integer>();
    ...
    for (int id: ids) {
       db.delete("table", "_id = ?", new String[] {String.valueOf(id)});
    }
    

    第二种方法:

    List<Integer> ids = new ArrayList<Integer>();
    ...
    StringBuilder b = new StringBuilder("delete from table where _id IN(");
    String[] whereArgs = new String[ids.size()];
    int index = 0;
    for (int id: ids) {
       whereArgs[index] = String.valueOf(id);
       b.append("?");
       if (index < ids.size() - 1) {
          b.append(",");
       }
       index++;
    }
    b.append(")");
    
    db.execSQL(b.toString(), whereArgs);
    

    第三种方法:

    与上述相同,但您可以使用SQLiteStatement

    SQLiteDatabase db; // instantiated SQLiteDatabase
    SQLiteStatement stm = db.compileStatement(b.toString());
    stm.executeUpdateDelete();
    


    注意:由于您要删除多条记录(有时需要删除10 000行以上),请尝试考虑TRANSACTIONS,以便快速提高性能和安全性。

答案 3 :(得分:0)

public void deleteContact(Integer id) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete("AddressList",
                "id = ? ",
                new String[]{Integer.toString(id)});
}

您可以使用原始SQL查询来删除行

public void deleteContact(Integer id) {
  SQLiteDatabase database = this.getWritableDatabase();
 String s = "DELETE FROM AddressList WHERE item_id=" + id;
database.execSQL(s);
}

此处 AddressList 是您的 TABLE 名称