Проблемы с удалением нескольких строк из базы данных SQLite - PullRequest
0 голосов
/ 21 марта 2012

Доброе утро, у меня возникли проблемы при попытке удалить несколько строк одновременно из моей базы данных. Когда я отлаживаю приложение, возникает исключение (CursorIndexOutOfBoundsException), и я не могу понять, как решить эту проблему. Заранее спасибо.

    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();  
        }
    });

Ответы [ 3 ]

1 голос
/ 21 марта 2012

Ваша основная проблема здесь:

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

Я не думаю, что курсор узнает, что одна из его строк была удалена, пока она еще была открыта. Таким образом, курсор автоматически не удаляет удаленную строку из своего «кэша», что означает проблемы с доступом к строке через уже удаленный курсор.

Я рекомендую использовать один оператор delete с соответствующим предложением where, что также будет способствовать повышению производительности.

Может быть, вот так: найдите первую строку (минимальный идентификатор строки), которую вы хотите сохранить, которая находится в 50 строках перед последней из ваших строк. Тогда вы можете просто выполнить delete from ... where _id < minimalRowId. Взгляните на moveToPosition ; тогда вы можете использовать cursor.moveToPosition( cursor.getCount() - 50 ), чтобы найти интересующий вас ряд.

1 голос
/ 21 марта 2012

Я считаю, что вы хотите удалить записи, которые имеют ID значение больше 50 .

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 голосов
/ 21 марта 2012

На самом деле вы должны передать данные в строке, разделенной запятой, а затем написать запрос на удаление, используя IN (] несколько идентификаторов])

например,

DELETE FROM Persons
WHERE LastName IN ('Person1','Person2',"Person3")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...