-1

例如,我想删除 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 中使用它。

4

3 回答 3

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需要更复杂的代码时。

于 2012-11-24T09:47:04.483 回答
1

不建议将 execSql 用于此操作或任何操作 SELECT/INSERT/UPDATE/DELETE,因为 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[])

于 2012-11-23T22:44:14.643 回答
0
DELETE FROM table WHERE _id IN 
  (SELECT _id FROM table ORDER BY _id ASC LIMIT 3);
于 2012-11-23T22:17:38.487 回答