Отражает ли удаление элемента из базы данных SQLiteDatabase изменения в идентификаторе других элементов?

#java #android #sqlite

#java #Android #sqlite

Вопрос:

Я работаю над структурой базы данных в Android Studio. Я еще не на стадии тестирования, но понимание более мелких деталей в том, как это работает, позволит мне написать лучшую структуру раньше, чем позже. К сожалению, есть один небольшой элемент, в котором я не уверен, который оказалось довольно сложно найти в Интернете.

Я создаю SQLiteDatabase и использую его для хранения значений, которые я представляю в вызываемом классе Task . Когда я ввожу каждый Task из них в базу данных, я также извлекаю идентификатор для сохранения в моем локальном контейнере newTask с newTask.SetId(mTaskDataSource.Create(newTask)) помощью . В конечном итоге я использую SQLiteDatabase для хранения своих задач в сеансах и использую a RecyclerView для отображения списка в activity . Это означает, что я должен отслеживать положение элементов как в, так SQLiteDatabase и в RecyclerView .

Если я удалю элемент в базе данных, будут ли последовательные идентификаторы элементов «каскадно уменьшаться» или они останутся на своих исходных значениях? Если нужен пример, учтите, что в моей базе данных хранятся элементы и отображаются идентификаторы. Если я начну с {0, 1, 2, 3} и удалю элемент 2 , будет ли моя база данных балансировать свои идентификаторы обратно {0, 1, 2} или у меня будет {0, 1, 3} ?

Поскольку я отрабатываю предположение о том, что он балансирует back ( {0, 1, 2} ) , я понял, что потенциально настраиваю себя на большую дополнительную / избыточную работу, если мои предположения неверны. Если он не балансируется таким образом, есть ли достаточно дешевый способ сделать это?

Я спрашиваю, будут ли номера идентификаторов перебалансироваться. Это не то же самое, что спрашивать, для чего на самом деле предназначен идентификационный номер, и это не дублирующий вопрос о каком-либо допустимом использовании моего вопроса. Я спрашиваю конкретно в отношении an SQLiteDatabase , а не общего Adapter .

Комментарии:

1. @CL., я добавил уточнение к своему вопросу. Очень явно отличается от «для чего нужен идентификатор».

2. Я не буду давать бесполезный ответ («нет») из-за проблемы XY . Ваша реальная проблема заключается в том, чтобы «отслеживать положение элементов как в, так SQLiteDatabase и в RecyclerView «, и связанный ответ показывает правильный способ сделать это.

3. @CL., я думаю, у нас есть некоторые трудности с пониманием друг друга. Ответ на вопрос вместо того, чтобы фокусироваться на контексте, значительно помогает. Что касается вопроса, на который вы ссылаетесь, большинство ответов просто сообщают мне, что такое идентификатор и почему мы его используем. Я уже знаю это, поскольку это основная механика базы данных. Это совсем не помогает мне понять, как я должен смещать идентификаторы для удаляемых строк.

4. Один ответ выделяется как частично полезный; Однако, поскольку в нем говорится только о Adapter классе, который SQLiteDatabase является только относительным на object уровне, я не вижу, как это будет работать, если я полностью не удалю SQLiteDatabase его в пользу другого Adapter . По сути, вы пытаетесь сказать: «это дубликат, потому что другой ответ должен вам помочь». У меня создалось впечатление, что вы не можете пометить вопрос как дубликат, полностью основанный на ответах, потому что, в конечном счете, это бесполезно.

5. a / нет, sqlite этого не делает по очевидным причинам, например, позволяя вам полагаться на значения идентификатора. b / что вы на самом деле пытаетесь сделать? если вы просто пытаетесь отсортировать элементы по порядку вставки, вы можете использовать индекс автоинкремента, чтобы явно предотвратить повторное использование удаленных идентификаторов.

Ответ №1:

База данных не изменяет свой идентификатор или любые другие данные в других строках при удалении одной строки. Идентификатор предназначен только для упрощения запросов соединения и других вещей, поэтому его нельзя изменять.

Если вы хотите иметь определенный порядок, вам не нужно использовать идентификатор строки. Данные будут возвращены в том порядке, в котором вы их добавили, поэтому вы можете использовать их индекс порядка (индекс строки в базе данных) в качестве индекса представления переработчика.

Комментарии:

1. послушайте, DB ничего не изменит для вас, вы используете ORM? используете ли вы какую-либо привязку данных? если это так, это может изменить ваши данные (хотя большинство форм ORM ничего не меняют, пока вы не вызовете .save()). поместите свой код, чтобы показать, где вы удаляете строку и как вы добавляете или обновляете данные.

2. если вы хотите иметь определенный порядок, вам не нужно использовать идентификатор строки, данные будут возвращены в том порядке, в котором вы их добавили, чтобы вы могли использовать их индекс порядка (индекс строки в БД) в качестве индекса RecyclerView.

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

4. tnx для вашего редактирования @Timelord64. жаль, что я не могу помочь 😉

Ответ №2:

Если ваш идентификатор является первичным ключом с autoincrement modifed , идентификатор будет увеличиваться только на единицу на основе текущего максимального индекса . БД не будет повторно использовать идентификатор, который вы использовали ранее .

Комментарии:

1. это здорово, но это не имеет ничего общего с тем, что я спросил. Несмотря на это, на мой вопрос уже дан ответ.