Google Android - это несложно

Добро пожаловать на форум сайта startandroid.ru
Текущее время: 21 янв 2017, 14:44

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 51 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Урок 39. onUpgrade. Обновляем БД в SQLite
СообщениеДобавлено: 05 дек 2011, 04:00 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 12:32
Сообщений: 1317
Благодарил (а): 0 раз.
Поблагодарили: 67 раз.
В этом уроке:

- меняем версию и обновляем структуру БД в onUpgrade

Click here to read this article!

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Последний раз редактировалось damager82 23 июн 2016, 22:18, всего редактировалось 6 раз(а).

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 39. onUpgrade. Обновляем БД в SQLite
СообщениеДобавлено: 09 янв 2012, 22:39 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 12:32
Сообщений: 1317
Благодарил (а): 0 раз.
Поблагодарили: 67 раз.
Цитата:
Прочитал пост и захотелось спросить в чем предпочтение сравнения версий БД вашого метода
if (oldVersion == 1 && newVersion == 2)
перед этим
if (db.needUpgrade(new Version)) ?


В данном случае, наверно, нет разницы. Просто решил как можно более наглядно продемонстрировать что старая версия была 1, а стала 2.

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 39. onUpgrade. Обновляем БД в SQLite
СообщениеДобавлено: 20 фев 2012, 14:36 
Аватар пользователя

Зарегистрирован: 17 фев 2012, 22:23
Сообщений: 1338
Откуда: Мордор
Благодарил (а): 16 раз.
Поблагодарили: 161 раз.
Странно, первый вариант мне показался более логичным.
В нем мы проверяем с какой версии на какую обновляем, в то время как needUpgrade(newVersion) говорит нам, стоит обновлять или нет, а если мы в onUpgrade зашли значит обновлять нужно.
Оптимальный вариант на мой взгляд:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. if (oldVersion <= 1) {
  2.         // Обновляем до версии 2
  3. }
  4. if (oldVersion <= 2) {
  5.         // Обновляем до версии 3
  6. }
  7. // И так далее...

Даже если пользователю нужно будет обновить версию базы с 1 до последней, все должно пройти идеально гладко.

_________________
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 39. onUpgrade. Обновляем БД в SQLite
СообщениеДобавлено: 22 фев 2012, 10:16 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 12:32
Сообщений: 1317
Благодарил (а): 0 раз.
Поблагодарили: 67 раз.
KamiSempai писал(а):
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. if (oldVersion <= 1) {
  2.         // Обновляем до версии 2
  3. }
  4. if (oldVersion <= 2) {
  5.         // Обновляем до версии 3
  6. }
  7. // И так далее...

Даже если пользователю нужно будет обновить версию базы с 1 до последней, все должно пройти идеально гладко.


А если, например, мы во второй версии ввели новый столбец в таблицу - column2. А в третьей версии еще столбец - column3.

Тогда что писать в в ветке if (oldVersion <= 2) { ?
Если добавлять только column3, тогда не сработает обновление с первой на третью версию. column2 будет упущен.
Если добавлять и column2 и column3, тогда при обновлении с версии 2 на 3 мы снова пытаемся создать column2. Он ругнется наверно? Т.е. в этом случае могут накатиться обновления, которые уже есть. Там какие-нить коллизии могут возникнуть.

ИМХО тут надо определять разницу между версиями, например текущая - 2, обновляемая - 5. И запускать по шагам обновление с версии на версию, т.е.
2 -> 3
3 -> 4
4 -> 5

В этом случае точно никаких коллизий не будет.
Но это только мысли. На практике я пока не реализовывал такое.

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 39. onUpgrade. Обновляем БД в SQLite
СообщениеДобавлено: 22 фев 2012, 13:44 
Аватар пользователя

Зарегистрирован: 17 фев 2012, 22:23
Сообщений: 1338
Откуда: Мордор
Благодарил (а): 16 раз.
Поблагодарили: 161 раз.
Я понял ход Ваших мыслей. Могу сказать, что мы думаем в одном направлении.
damager82 писал(а):
Тогда что писать в в ветке if (oldVersion <= 2) { ?

Добавлять столбец column3. Столбец column2 к этому времени уже будет добавлен в предыдущем условии, либо при прошлом обновлении базы, когда последней считалась версия 2.
damager82 писал(а):
ИМХО тут надо определять разницу между версиями, например текущая - 2, обновляемая - 5. И запускать по шагам обновление с версии на версию, т.е.
2 -> 3
3 -> 4
4 -> 5

В моем случае так и получится. Условия идут друг за другом и ни как друг на друга не влияют. При версии - 2, условие "oldVersion <= 1" не выполнится, а "oldVersion <= 2" выполнится, и "oldVersion <= 3" выполнится по тому, что 2 <= 3.

_________________
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 39. onUpgrade. Обновляем БД в SQLite
СообщениеДобавлено: 14 авг 2012, 14:34 

Зарегистрирован: 13 авг 2012, 15:16
Сообщений: 9
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Насколько я понимаю средние три команды:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. db.execSQL("drop table people;");
  2.  
  3. db.execSQL("create table people ("
  4.               + "id integer primary key autoincrement,"
  5.               + "name text, posid integer);");
  6. db.execSQL("insert into people select id, name, posid from people_tmp;");
  7. db.execSQL("drop table people_tmp;");
  8.  
  9. db.setTransactionSuccessful();

можно заменить на одну:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. db.execSQL("drop table people;");
  2.  
  3. db.execSQL("ALTER TABLE people_tmp RENAME TO people;");
  4.  
  5. db.setTransactionSuccessful();

т.е. нет смысла создавать заново people и перегонять данные обратно (ведь структура теперь у таблиц одинаковая), а можно просто переименовать таблицу. Такая возможность наряду с добавлением поля есть.

ЗЫ: Обратил внимание на то, что people_tmp создается во временной БД. Тогда нужно поменять еще несколько строк. Итого все должно выглядеть так:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. db.execSQL("create table people_tmp ("
  2.               + "id integer primary key autoincrement, name text, position text, posid integer);"); //убираем temporary и добавляем опции к id
  3.  
  4. db.execSQL("insert into people_tmp select name, position, posid from people;"); //убираем поле id
  5. db.execSQL("drop table people;");
  6.  
  7. db.execSQL("ALTER TABLE people_tmp RENAME TO people;");
  8.  
  9. db.setTransactionSuccessful();


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 39. onUpgrade. Обновляем БД в SQLite
СообщениеДобавлено: 05 ноя 2012, 21:09 

Зарегистрирован: 05 ноя 2012, 20:55
Сообщений: 1
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Здравствуйте! Объясните, пожалуйста по-подробней, откуда в метод onUpgrade передаются аргументы oldVersion и newVersion. Заранее благодарю.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 39. onUpgrade. Обновляем БД в SQLite
СообщениеДобавлено: 06 ноя 2012, 17:20 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 12:32
Сообщений: 1317
Благодарил (а): 0 раз.
Поблагодарили: 67 раз.
zagidram писал(а):
Здравствуйте! Объясните, пожалуйста по-подробней, откуда в метод onUpgrade передаются аргументы oldVersion и newVersion. Заранее благодарю.

- при создании DBHelper вы указываете версию БД в конструкторе (newVersion)
- прога смотрит на имеющийся файл с БД, читает из него версию (oldVersion)

Две этих цифры сравниваются, если они разные, то вызывается onUpgrade. Думаю, как-то так.

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 39. onUpgrade. Обновляем БД в SQLite
СообщениеДобавлено: 13 дек 2012, 23:32 
Аватар пользователя

Зарегистрирован: 20 окт 2012, 13:01
Сообщений: 4201
Благодарил (а): 68 раз.
Поблагодарили: 467 раз.
А как обновлять таблицу, в которой есть автоинкрементное поле?
Допустим, есть таблица заголовков, и таблица деталей - оба с инкрементным полем - первичным ключом. Вторая имеет поле-ссылку на строку в таблице заголовков.
Ведь при любом обновлении-удалении автоинкрементное поле нельзя назначить "как было".
Или можно? может быть какая-то команда есть, чтоб временно заносить туда значения во время операций обновления БД

_________________
R.id.team

NullPointerException - что делать???
http://forum.startandroid.ru/viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
http://forum.startandroid.ru/viewtopic.php?f=60&t=3198


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 39. onUpgrade. Обновляем БД в SQLite
СообщениеДобавлено: 24 дек 2012, 20:04 

Зарегистрирован: 23 авг 2012, 09:43
Сообщений: 22
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Я читал что execSQL() медленнее стандартных методов работы с базой. Подскажите из практики когда становится не рациональным использовать execSQL(), т.к. конечно проще использовать стандартные запросы в execSQL() если знаком с синтаксисом SQL нежели стандартными методами.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 39. onUpgrade. Обновляем БД в SQLite
СообщениеДобавлено: 24 дек 2012, 20:09 

Зарегистрирован: 23 авг 2012, 09:43
Сообщений: 22
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Olivka писал(а):
А как обновлять таблицу, в которой есть автоинкрементное поле?
Допустим, есть таблица заголовков, и таблица деталей - оба с инкрементным полем - первичным ключом. Вторая имеет поле-ссылку на строку в таблице заголовков.
Ведь при любом обновлении-удалении автоинкрементное поле нельзя назначить "как было".
Или можно? может быть какая-то команда есть, чтоб временно заносить туда значения во время операций обновления БД

Поле ключей не повторяется. При обновлении ключ не меняется, т.к. его нельзя поменять, а при удалении этот ключ больше не появится. Уточните вопрос, что у вас не получается?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 39. onUpgrade. Обновляем БД в SQLite
СообщениеДобавлено: 25 дек 2012, 01:54 
Аватар пользователя

Зарегистрирован: 20 окт 2012, 13:01
Сообщений: 4201
Благодарил (а): 68 раз.
Поблагодарили: 467 раз.
Roman писал(а):
Я читал что execSQL() медленнее стандартных методов работы с базой. Подскажите из практики когда становится не рациональным использовать execSQL(), т.к. конечно проще использовать стандартные запросы в execSQL() если знаком с синтаксисом SQL нежели стандартными методами.

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

_________________
R.id.team

NullPointerException - что делать???
http://forum.startandroid.ru/viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
http://forum.startandroid.ru/viewtopic.php?f=60&t=3198


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 39. onUpgrade. Обновляем БД в SQLite
СообщениеДобавлено: 25 дек 2012, 01:59 
Аватар пользователя

Зарегистрирован: 20 окт 2012, 13:01
Сообщений: 4201
Благодарил (а): 68 раз.
Поблагодарили: 467 раз.
Roman писал(а):
Olivka писал(а):
А как обновлять таблицу, в которой есть автоинкрементное поле?
Допустим, есть таблица заголовков, и таблица деталей - оба с инкрементным полем - первичным ключом. Вторая имеет поле-ссылку на строку в таблице заголовков.
Ведь при любом обновлении-удалении автоинкрементное поле нельзя назначить "как было".
Или можно? может быть какая-то команда есть, чтоб временно заносить туда значения во время операций обновления БД

Поле ключей не повторяется. При обновлении ключ не меняется, т.к. его нельзя поменять, а при удалении этот ключ больше не появится. Уточните вопрос, что у вас не получается?

У меня не неполучается, просто я искала какой-нибудь быстрый способ.
По-другому объяснить не знаю как - случай обычный. Есть таблица с заголовками, есть таблица с деталями и полем со ссылков на таблицу с заголовками. и там и там автоинкреметное поле _id имеется, т.е. случай наираспространеннейший.
table 1
_id; name
table2
_id; name; id_table1
_id - автоинкремент в обоих случаях.

Так вот я и думала - как лучше организовать процедуру при обновлении этих таблиц (т.е. когда меняется версия базы данных, и работает процедура onUpdate). ТАм надо данные из таблиц этих выгрузить во временную, пересоздать основную таблицу а затем данные вернуть на место в новые, создавшиеся таблицы. Но когда данные загружаем обратно, то автоинкрементное поле будет иметь другие значения, и получается, что нужно их как-то сохранять, чтобы при вставке записей в подчиненную таблицу правильно заполнять это поле.

_________________
R.id.team

NullPointerException - что делать???
http://forum.startandroid.ru/viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
http://forum.startandroid.ru/viewtopic.php?f=60&t=3198


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 39. onUpgrade. Обновляем БД в SQLite
СообщениеДобавлено: 25 дек 2012, 12:23 
Аватар пользователя

Зарегистрирован: 17 фев 2012, 22:23
Сообщений: 1338
Откуда: Мордор
Благодарил (а): 16 раз.
Поблагодарили: 161 раз.
Olivka писал(а):
Так вот я и думала - как лучше организовать процедуру при обновлении этих таблиц (т.е. когда меняется версия базы данных, и работает процедура onUpdate).
Что именно вы хотите изменить? Если что, выгружать данные во временные таблицы нужно только если необходимо удалить лишние столбцы. Для добавления столбца нужно использовать SQL команду ALTER TABLE.
И на сколько я знаю, автоинкрементное поле можно свободно перезаписывать, проблем возникнуть не должно. Нужно только следить за тем, что-бы уникальность не нарушалась, если это поле ключевое.

_________________
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 39. onUpgrade. Обновляем БД в SQLite
СообщениеДобавлено: 25 дек 2012, 13:51 
Аватар пользователя

Зарегистрирован: 20 окт 2012, 13:01
Сообщений: 4201
Благодарил (а): 68 раз.
Поблагодарили: 467 раз.
KamiSempai писал(а):
И на сколько я знаю, автоинкрементное поле можно свободно перезаписывать, проблем возникнуть не должно. Нужно только следить за тем, что-бы уникальность не нарушалась, если это поле ключевое.

В первый раз об этом слышу

_________________
R.id.team

NullPointerException - что делать???
http://forum.startandroid.ru/viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
http://forum.startandroid.ru/viewtopic.php?f=60&t=3198


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 39. onUpgrade. Обновляем БД в SQLite
СообщениеДобавлено: 25 дек 2012, 14:51 
Аватар пользователя

Зарегистрирован: 17 фев 2012, 22:23
Сообщений: 1338
Откуда: Мордор
Благодарил (а): 16 раз.
Поблагодарили: 161 раз.
Olivka писал(а):
В первый раз об этом слышу
Думаю, стоит это проверить.

_________________
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 39. onUpgrade. Обновляем БД в SQLite
СообщениеДобавлено: 25 дек 2012, 15:39 
Аватар пользователя

Зарегистрирован: 20 окт 2012, 13:01
Сообщений: 4201
Благодарил (а): 68 раз.
Поблагодарили: 467 раз.
Проверила. ДУмаю, не стоит этого делать, т.к. генератор дуреет.
Например. Вношу сама значение следующего числа как 6. Затем вношу строку с пустым значением. Подтверждаю транзакцию. Генератор вносит 7-ку, вроде бы все хорошо.
окей. Вношу значение 33, подтверждаю транзакцию, затем вношу пустое значение, подтверждаю, генератор вносит 34. Опять все хорошо. Вношу значение 12, оно уникально, его нету, подтверждаю транзакцию, вместо 12-ти оказывается внесено число 34 - еще одна строка с ID 34, несмотря на то, что это PK.
Поэтому, лучше я не буду сама вносить туда числа, мало ли какой будет сбой.

_________________
R.id.team

NullPointerException - что делать???
http://forum.startandroid.ru/viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
http://forum.startandroid.ru/viewtopic.php?f=60&t=3198


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 39. onUpgrade. Обновляем БД в SQLite
СообщениеДобавлено: 30 янв 2013, 15:38 
Аватар пользователя

Зарегистрирован: 09 янв 2012, 15:45
Сообщений: 2383
Откуда: Самара
Благодарил (а): 102 раз.
Поблагодарили: 320 раз.
А как быть с обновлением базы, которая находится на флешке и используется API7 ? Напомню, что в этом случае DBHelper идет лесом. Используется голый SQLiteDatabase. Пока в мыслях писать вручную всё это дело. В принципе не особо сложно, но может кто знает что более гуманное.

_________________
Изображение

А тот ли ты путь выбрал, разработчик?
Хочешь знать ошибки ответ? Загляни в logcat!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 39. onUpgrade. Обновляем БД в SQLite
СообщениеДобавлено: 31 янв 2013, 01:14 
Аватар пользователя

Зарегистрирован: 17 фев 2012, 22:23
Сообщений: 1338
Откуда: Мордор
Благодарил (а): 16 раз.
Поблагодарили: 161 раз.
no-- писал(а):
А как быть с обновлением базы, которая находится на флешке и используется API7 ? Напомню, что в этом случае DBHelper идет лесом. Используется голый SQLiteDatabase. Пока в мыслях писать вручную всё это дело. В принципе не особо сложно, но может кто знает что более гуманное.
Тоже сейчас этим вопросом озадачен. Ни чего, кроме как создать специальную таблицу для хранения версии, в голову не приходит.

_________________
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 39. onUpgrade. Обновляем БД в SQLite
СообщениеДобавлено: 31 янв 2013, 02:15 
Аватар пользователя

Зарегистрирован: 26 июн 2012, 14:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
юзайте ormlite и будет вам счастье =)

_________________
R.id.team
Политика на форуме запрещена


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 51 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 4 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB