在sqlite中删除某些行,这些行具有使用java在表中相对较旧的特定数据

时间:2012-11-23 22:12:01

标签: java android eclipse sqlite delete-row

我想删除例如color1为蓝色的前3个(最旧的)。

示例数据集:

_id  |  name  |  surname  |  color1  |  color2    
  1  |  mark  |  jacobs   |  blue    |  green    
  2  |  tony  |  hilo     |  black   |  red    
  13 |  lisa  |  xyz      |  blue    |  green    
  4  |  andre |  qwerty   |  blue    |  green    
  9  |  laura |  abc      |  black   |  red    
  14 |  kerr  |  jacobs   |  blue    |  green

我想使用execsql而不是db.delete .. 哪种方法更可取? 我的代码应该是什么样的?

我将在Android应用程序中使用此内部eclipse。

3 个答案:

答案 0 :(得分:2)

db.execSQL("DELETE FROM MyTable WHERE _id IN " +
           "(SELECT _id FROM MyTable WHERE color1 = ? ORDER BY _id LIMIT 3)",
           new Object[] { "blue" });
使用

execSQL非常好,特别是当命令太复杂以至于使用delete需要更复杂的代码时。

答案 1 :(得分:1)

不建议对此操作或任何操作SELECT / INSERT / UPDATE / DELETE使用execSql,因为execSql不会返回任何内容,例如受此查询影响的错误或行。

相反,虽然写出来需要更长的时间

Cursor c = db.query(table, new String[]{"_id"}, "color1" +"=?", new String[]{"blue"}, null,null,"_id ASC","3");
String ids="";
String qs = "";
for(c.moveToFirst();!c.isAfterLast();c.moveToNext()){
   ids+=c.getInt(c.getColumnIndex("_id")+",";
   qs+="?,"
}
ids= ids!=""?ids.substring(0, ids.length() - 1):ids;
qs= qs!=""?ids.substring(0, qs.length() - 1):qs;
db.delete(table, "_id IN ("+qs+")", ids.split(","));

这是execsql为什么不适合这种情况的参考 http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#execSQL(java.lang.String,java.lang.Object [])

答案 2 :(得分:0)

DELETE FROM table WHERE _id IN 
  (SELECT _id FROM table ORDER BY _id ASC LIMIT 3);