2012-03-21 3 views
0

안녕하세요, 내 데이터베이스에서 동시에 여러 행을 삭제하려고 할 때 몇 가지 문제가 있습니다. 응용 프로그램을 디버깅 할 때 예외가 throw됩니다 (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

난 당신이 50보다 큰 값 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

사실 당신은

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

기본 문제는 여기에, (] 여러 아이디의])

예를 들면 IN 사용하여 쿼리를 삭제 혼수 구분 된 문자열에 데이터를 전달하고 작성해야합니다 :

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

커서가 행 중 하나가 삭제 된 것을 알게 될 것이라고 생각하지 않습니다. 펜. 따라서 커서는 삭제 된 행을 "캐쉬"에서 자동으로 제거하지 않으므로 이미 삭제 된 커서를 통해 행에 액세스 할 때 문제가 발생합니다.

적절한 where 절을 사용하여 단일 delete 문을 사용하는 것이 좋습니다. 이는 성능에도 도움이됩니다.

아마도 다음과 같을 수 있습니다. 유지하려는 첫 번째 행 (최소 rowId)을 찾습니다.이 행은 마지막 행보다 50 행 앞에 있습니다. 그러면 delete from ... where _id < minimalRowId을 수행하면됩니다. moveToPosition을 살펴보십시오. 그런 다음 cursor.moveToPosition(cursor.getCount() - 50)을 사용하여 관심있는 행을 찾을 수 있습니다.

관련 문제