2012-03-21 18 views
0

おはようございます、私はdbから同時にいくつかの行を削除しようとしているときにいくつか問題があります。私は、アプリケーションをデバッグする例外がスローされ(CursorIndexOutOfBoundsException)と私はこの問題を解決する方法を見つけることができません。前もって感謝します。SQLiteデータベースから複数の行を削除する際の問題

btnDel.setOnClickListener(new View.OnClickListener() { 

     public void onClick(View v) { 
     DBAdapter db = new DBAdapter(getBaseContext()); 

     db.open(); 
     Cursor c = db.getAllContacts(); 
     int rowId = c.getInt(0); 
     while(c.getCount() > 50) 
     { 
      db.deleteContact(rowId); 
        Toast.makeText(getBaseContext(), "Deleted", Toast.LENGTH_SHORT).show(); 
     }  
     db.close(); 
     } 
    }); 

答えて

1

私はあなたがより大きな値IDを持つレコードを削除したいと考えています。

DBAdapter db = new DBAdapter(getBaseContext()); 
db.open(); 
Cursor c = db.getAllContacts(); 

while(c.moveToNext()) 
{ 
    int rowId = c.getInt(0); 
    if(rowId > 50){ 
     db.deleteContact(rowId); 
     Toast.makeText(getBaseContext(), "Deleted", Toast.LENGTH_SHORT).show(); 
    } 
} 
c.close(); 
db.close(); 
+0

実際には、古いエントリ(_idの低い行)を削除して、行数を50に制限しようとしていますが、これはすでに大変助かりました。ありがとう –

0

実際にあなたが昏睡区切りの文字列にデータを渡し、その後のUSINGクエリを削除記述する必要があります(複数のIDの]])

例えば、

DELETE FROM Persons 
WHERE LastName IN ('Person1','Person2',"Person3") 
1

あなたの主な問題はここにあります:

int rowId = c.getInt(0); 
    while(c.getCount() > 50) 
    { 
     db.deleteContact(rowId); 

カーソルがまだその行の1つが削除されたことを知ることはできませんペン。したがって、カーソルは削除された行を自動的に "キャッシュ"から削除しません。これは、すでに削除されたカーソルを介して行にアクセスする際に問題が発生することを意味します。

適切なwhere句を指定してdelete文を1つ使用することをお勧めします。これは、パフォーマンスにも役立ちます。

これはおそらく次のようになります。保存したい最初の行(最小行ID)を見つけます。これは、最後の行の前に50行あります。次に、delete from ... where _id < minimalRowIdを実行するだけです。 moveToPositionをご覧ください。 cursor.moveToPosition(cursor.getCount() - 50)を使って興味のある行を見つけることができます。

関連する問題