Ваша основная проблема здесь:
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 )
, чтобы найти интересующий вас ряд.