-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

db.deleteではなくexecsqlを使用したいのですが、どちらの方法が望ましいですか?そして私のコードはどのようにすべきですか?

私はこれを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 に答える