2016-01-28 3 views
-1

У меня есть база данных SQLite в моем приложении Android, которая содержит несколько записей имени пользователя/пароля, этот контент помещается в ListView.Обновление поля ID в базе данных SQLite при удалении записи

То, что я хотел бы достичь, это когда элемент сжимается, он удаляется из списка, но я столкнулся с проблемой.

Я использую следующий код, чтобы удалить запись из базы данных:

public void deleteEntry(int ID) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    db.delete(TABLE_LOGINS, KEY_ID + " = ?", 
      new String[]{Integer.toString(ID)}); 
    db.close(); 
    } 

Данные хранятся в базе данных следующим образом:

-------------------------- 
1|server|username|password 
2|server|username|password 
3|server|username|password 
4|server|username|password 
-------------------------- 

Теперь, если я должен был отметить запись # 2 для удаления, я в конечном итоге получаю следующее:

-------------------------- 
1|server|username|password 
3|server|username|password 
4|server|username|password 
-------------------------- 

Что вызывает проблемы, другие записи, так как я все свои поиски использую в первом поле. Используя позицию из моего OnItemLongClickListener, если бы я должен был нажать второй элемент в списке, он бы искал элемент с идентификатором 2.

Как обновить записи в моей базе данных, чтобы мое поле ID быть последовательно пронумерованы? Есть ли лучшая альтернатива использованию поля идентификатора?

+0

Каким образом данные отображаются в списке? Я имею в виду, вы его сортируете в любом случае? –

+0

Почему вы используете позицию, а не идентификатор? –

+0

@TeChNo_DeViL Я показываю его в том порядке, в котором я его получаю из базы данных – keag

ответ

0

Было бы лучше просто сбросить столбцы идентификации, вы можете обратиться к этому вопросу: SQL Server Reset Identity Increment for all tables

Обратите внимание, что, опираясь на все ваши столбцы являются инкрементный довольно плохая практика, я бы посоветовал вам связать каждую строку в базы данных в строку в вашей программе, поэтому при загрузке вы выбираете каждый элемент из базы данных и создаете для него строку в своей программе, это устраняет эту проблему.

0

Я могу предложить простое изменение.

При загрузке списка (используя CursorLoader, если вы используете его), сохраните список загружаемых идентификаторов. Это может быть достигнуто путем объявления глобального ArrayList<Integer>, содержащего идентификаторы загруженных полей. Теперь, используя onLongItemClicked или аналогичные методы, вы можете просто удалить строки из базы данных с помощью идентификаторов с помощью метода get(position) на объекте ArrayList<Integer>, чтобы получить идентификатор, удерживаемый в настоящее время элементом строки. Наконец, после удаления из базы данных, удалите ID из ArrayList, и вы готовы к еще одному раунду удаления.

Смежные вопросы