SQLite (Android): ОБНОВИТЬ запрос с ORDER BY - PullRequest
0 голосов
/ 18 февраля 2019

Android, SQLite: я хочу вставить строки между другими строками в myTable , используя SQLite в Android.Для этого я пытаюсь увеличить идентификаторы всех строк, начиная, скажем, со строки 3. Чтобы я мог вставить новую строку в позицию 3.

Первичным ключом myTable является идентификатор столбца.Других ограничений в таблице нет.

Я пытался использовать запрос, упомянутый в https://stackoverflow.com/a/9177264/6671004. Этот запрос работает в mySQL, но не в Android (SQLite)

Вот строка кода:

database.execSQL("UPDATE myTable SET id = (id + 1) where id > 2 ORDER BY id desc");

Вот ошибка, которую я получаю в Android Studio (время компиляции): https://imgur.com/a/9r0iyAa

Этоэто исключение, которое я получаю, если удалить из запроса 'ORDER BY id DESC':

java.lang.RuntimeException: Невозможно запустить действие ComponentInfo {...}: android.database.sqlite.SQLiteConstraintException: сбой ограничения UNIQUE: myTable.id (код 1555)

Это правильный способ сделать это?Или есть лучший способ?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Как отмечают многие, это определенно не правильный путь.

Но я нашел обходной путь в случае, если кто-то ищет подобную реализацию.

Вот оно:

UPDATE myTable SET id = - (id + 1) WHERE id > 1;
UPDATE myTable SET id = - id WHERE id < 0;

Это хак, который я нашел здесь .

Опять же, это не правильный путь .Но я просто опубликовал работающее решение, которое я нашел.

0 голосов
/ 19 февраля 2019

Я пытался использовать запрос, упомянутый в https://stackoverflow.com/a/9177264/6671004. Этот запрос работает в mySQL, но не в Android (SQLite)

Этот вопрос помечен как MYSQL.MYSQL имеет много отличий от SQLite.

Вот строка кода:

database.execSQL("UPDATE myTable SET id = (id + 1) where id > 2 ORDER BY id desc");

ОБНОВЛЕНИЕ SQLite SQL имеет вид: -

enter image description here

  • т.е. нет предложения ORDER BY и, следовательно, ошибка говорит о том, что если вы собираетесь использовать любое KEYWORD, то это должно быть BETWEEN или INили ; (конечно, вы также можете расширить условие, используя AND ИЛИ и т. д.).

Это исключение, которое я получаю, еслиЯ удаляю 'ORDER BY id DESC' из запроса:

Причина в том, что rowid (идентификатор является псевдонимом rowid ), имеетподразумевается УНИКАЛЬНОЕ ограничение и то, что строки будут обновляться в соответствии со столбцом id по порядку.Таким образом, если имеется более 3 строк (или было и последняя строка никогда не удалялась), тогда, когда идентификатор равен 3, будет существовать строка с 4 и 3 + 1 = 4, поэтому строка уже существует и, следовательно, ограничение UNIQUEвстречается.

Я хочу вставить строки между другими строками в myTable, используя SQLite в Android.Для этого я пытаюсь увеличить идентификаторы всех строк, начиная, скажем, со строки 3. Чтобы я мог вставить новую строку в позицию 3.

Короче говоря, это не очень хорошая идеяи фактически определенно не нужен.

Это правильный способ сделать это?Или есть лучший способ?

Определенно нет

По предположению, вам нужна приятная понятная человеку ценность, чтобы вы могли знать, что происходит.Например, вы можете представить список с последовательностью, чтобы затем сказать, удалить строку с последовательностью 3 и, таким образом, приравнять ее к столбцу id.Хорошо, пока вы не представите список в другом порядке, который может быть более удобным для пользователя.Внезапно ваша последовательность усложняется или становится даже бесполезной, и если она отображается сбивающей с толку.

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

Эффективная методология представляет список с привязкой id к позиции в списке (таким образом, позиция может быть n-м элементоммассива, который содержит соответствующий идентификатор, восстанавливающий список (базовый массив) в соответствии с другим порядком, так что n-й элемент будет по-прежнему иметь соответствующий идентификатор).

Запуск процесса смещения строк приведет к дополнительномуиспользование ресурсов, например, дополнительный дисковый ввод-вывод, стоимость которого относительно высока.Это будет усугубляться тем фактом, что вам придется обрабатывать строки в обратном порядке, чтобы обойти ограничение UNIQUE, что само по себе потребует использования более дорогих методов, поскольку SQLite по умолчанию будет пытаться выполнять обновления эффективно, а не обслуживатьдля эффективности, необходимой для отклонения от признанных / принятых методов, которые используют основную эффективность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...