Предскажите затем автовставленный идентификатор строки (SQLite)

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

15
задан Peter Mortensen 27 November 2010 в 20:33
поделиться

8 ответов

Или фрагментирование или фиксация ряда операций базы данных внезапно точно, для чего транзакции. Запрос BEGIN; перед пользователем начинает играть и COMMIT;, после того как он сделан. Вам гарантируют это любой, все изменения применяются (если Вы фиксируете), или все фрагментируется (если Вы запрашиваете ROLLBACK;, если программа отказывает, питание выходит, и т.д.). После того как Вы читаете из дб, Вам также гарантируют это, данные хороши до конца транзакции, таким образом, можно захватить MAX(id) или независимо от того, что Вы хотите, не волнуясь об условиях состязания.

http://www.sqlite.org/lang_transaction.html

15
ответ дан 1 December 2019 в 00:30
поделиться

Можно, вероятно, сойти с рук добавление 1 к значению, возвращенному sqlite3_last_insert_rowid при определенных условиях, например, с помощью того же соединения с базой данных и нет никаких других параллельных устройств записи. Конечно, можно обратиться к sqlite исходному коду для резервного копирования этих предположений.

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

3
ответ дан 1 December 2019 в 00:30
поделиться

Вставьте строку с флагом INVALID некоторого вида, Получите идентификатор, отредактируйте его, по мере необходимости, удалите при необходимости или метка как допустимая. Это и не волнуется о разрывах в последовательности

BTW, необходимо будет выяснить, как сделать недопустимую часть сами. При отмечании чего-то, поскольку ПУСТОЙ УКАЗАТЕЛЬ мог бы работать в зависимости от специфических особенностей.

Редактирование: , Если Вы можете, используйте предложение Eevee использования надлежащих транзакций. Это - намного меньше работы.

2
ответ дан 1 December 2019 в 00:30
поделиться

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

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

В большинстве сред Вы не можете предположить, что полученные данные через ВЫБОР в рамках транзакции повторяемы. Например

SELECT Balance FROM Bank ...
UPDATE Bank SET Balance = valuefromselect + 1.00 WHERE ...

Последующий для ОБНОВЛЕНИЯ значения баланса может быть изменен. Иногда можно обойти это путем обновления строки (строк) заинтересованное Банком сначала в рамках транзакции, поскольку это, как гарантируют, заблокирует строку, препятствующую тому, чтобы дальнейшие обновления изменили ее значение, пока транзакция не завершилась.

Однако иногда лучший способ гарантировать непротиворечивость в этом случае состоит в том, чтобы проверить Ваши предположения о содержании данных в операторе Where обновления и количества контрольной строки в приложении. В примере выше "ПРИ ОБНОВЛЕНИИ Банка", оператор Where должен обеспечить ожидаемое текущее значение баланса:

WHERE Balance = valuefromselect

, Если ожидаемый баланс больше не соответствует, ни один не делает, ГДЕ условие - ОБНОВЛЕНИЕ ничего не делает, и rowcount возвращается 0. Это говорит Вам, что была проблема параллелизма, и необходимо повторно выполнить операцию снова, когда что-то еще не пытается изменить данные одновременно.

2
ответ дан 1 December 2019 в 00:30
поделиться

Я думаю, что это не может быть сделано, потому что нет никакого способа быть уверенным, что ничто не будет вставлено между Вами выяснение и Вы вставка. (Вы смогли блокировать таблицу к вставкам, но Фу)

BTW я только использовал MySQL, но я не думаю, что это будет иметь любое значение)

0
ответ дан 1 December 2019 в 00:30
поделиться

Скорее всего, необходимо смочь к +1 новый идентификатор. Я посмотрел бы на все (возвращение некоторое время) существующего идентификатора в заказанной таблице.. Действительно ли они последовательны, и идентификатор каждой строки, еще один, чем последнее? Если так, Вы, вероятно, будете в порядке. Я оставил бы комментарии в коде, объяснив предположение как бы то ни было. Выполнение Блокировки поможет гарантировать, что Вы не получаете дополнительные строки, в то время как Вы делаете это также.

0
ответ дан 1 December 2019 в 00:30
поделиться

Выберите last_insert_rowid () значение.

0
ответ дан 1 December 2019 в 00:30
поделиться

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

0
ответ дан 1 December 2019 в 00:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: