Урок 35. SQLite. Методы update и delete с указанием условия

Обсуждение уроков
Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение doter.ua » 27 янв 2015, 03:19

rustech писал(а):Правильно понимаю, что строки кода

Код: Выделить всё

if (id.equalsIgnoreCase("")) {
break;
}
в case R.id.btnUpd: и case R.id.btnDel влияют только на то, что в логах не выводится запись об обновлении или удалении записи? Или там какой-то более глубокий смысл?
Они обновляют\удаляют записи. Что же касается кода, который вы скинули: если вы внимательно изучали урок, то должны были заметить, что id - это значение из ЕдитТекста, который заполняет юзер, то есть - вы. String id = etID.getText().toString(); Следовательно если вы ничего не заполните, то и данных не будет. Собсна это и проверяется: if (ид.равен пустой строке ).
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

rustech
Сообщения: 9
Зарегистрирован: 20 янв 2015, 12:27
Откуда: Москва

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение rustech » 27 янв 2015, 11:35

doter.ua писал(а): Что же касается кода, который вы скинули: если вы внимательно изучали урок, то должны были заметить, что id - это значение из ЕдитТекста, который заполняет юзер, то есть - вы. String id = etID.getText().toString(); Следовательно если вы ничего не заполните, то и данных не будет. Собсна это и проверяется: if (ид.равен пустой строке ).
Да, но зачем проверяется то, что ничего не заполнено? Чтобы не выводить запись в лог и не выполнять обработчик, если поле пустое?

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение doter.ua » 27 янв 2015, 11:48

rustech писал(а):
doter.ua писал(а): Что же касается кода, который вы скинули: если вы внимательно изучали урок, то должны были заметить, что id - это значение из ЕдитТекста, который заполняет юзер, то есть - вы. String id = etID.getText().toString(); Следовательно если вы ничего не заполните, то и данных не будет. Собсна это и проверяется: if (ид.равен пустой строке ).
Да, но зачем проверяется то, что ничего не заполнено? Чтобы не выводить запись в лог и не выполнять обработчик, если поле пустое?

Код: Выделить всё

case R.id.btnUpd:
      if (id.equalsIgnoreCase("")) {
        break;
      }
      Log.d(LOG_TAG, "--- Update mytabe: ---");
      // подготовим значения для обновления
      cv.put("name", name);
      cv.put("email", email);
      // обновляем по id
      int updCount = db.update("mytable", cv, "id = ?",
          new String[] { id });
      Log.d(LOG_TAG, "updated rows count = " + updCount);
      break;
Вот обновление: int updCount = db.update("mytable", cv, "id = ?",
new String[] { id });
Не знаете что такое break ? - гугл.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

rustech
Сообщения: 9
Зарегистрирован: 20 янв 2015, 12:27
Откуда: Москва

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение rustech » 29 янв 2015, 02:25

doter.ua писал(а): Вот обновление: int updCount = db.update("mytable", cv, "id = ?",
new String[] { id });
Не знаете что такое break ? - гугл.
Да я не об этом :)
Разобрался. Еще удалить этот код (проверку на пустое значение id)

Код: Выделить всё

if (id.equalsIgnoreCase("")) {
                    break;
                }
то при нажатии на кнопку update и при пустом поле id программа выполнит действия с таблицей базы данных, но ничего в ней не изменит и в логи выведет сообщение

Код: Выделить всё

--- Update mytabe: ---
updated rows count = 0
Т.е., сделал я для себя вывод, проверка на пустое значение id нужна для того, чтобы не лишний раз запускать процесс работы с таблицей базы данных, оптимизировав тем самым работу приложения.

rustech
Сообщения: 9
Зарегистрирован: 20 янв 2015, 12:27
Откуда: Москва

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение rustech » 29 янв 2015, 02:58

lstaticl писал(а):Если указать в поле id не цифры, а буквы, или float число - приложение упадет.
Проверял, действительно так.
lstaticl писал(а):А в целом по теории работы с БД, осуществляя выборку по ID или иные действия по ID - нужно приводить переменную к INT и после проверять на 0. Тогда не надо проверять на пустоту, и нет возможности для Injection. :)
Если вышесказанное корректно, буду признателен, если чуть подробнее объясните, как реализовывается проверка на ноль. Приведение переменной к int, насколько понял, так:

Код: Выделить всё

        String id = etID.getText().toString();
        int idInt = Integer.parseInt(id);

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение doter.ua » 29 янв 2015, 11:51

rustech писал(а):
doter.ua писал(а): Вот обновление: int updCount = db.update("mytable", cv, "id = ?",
new String[] { id });
Не знаете что такое break ? - гугл.
Да я не об этом :)
Разобрался. Еще удалить этот код (проверку на пустое значение id)

Код: Выделить всё

if (id.equalsIgnoreCase("")) {
                    break;
                }
то при нажатии на кнопку update и при пустом поле id программа выполнит действия с таблицей базы данных, но ничего в ней не изменит и в логи выведет сообщение

Код: Выделить всё

--- Update mytabe: ---
updated rows count = 0
Т.е., сделал я для себя вывод, проверка на пустое значение id нужна для того, чтобы не лишний раз запускать процесс работы с таблицей базы данных, оптимизировав тем самым работу приложения.
Ничего ты не понял. перечитай код еще раз.
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

rustech
Сообщения: 9
Зарегистрирован: 20 янв 2015, 12:27
Откуда: Москва

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение rustech » 30 янв 2015, 08:22

doter.ua писал(а): Ничего ты не понял. перечитай код еще раз.
Спасибо :D

vladsalat93
Сообщения: 5
Зарегистрирован: 09 фев 2015, 17:27

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение vladsalat93 » 09 фев 2015, 17:34

can't resolve symbol id, почему?

Код: Выделить всё


        case R.id.btnUpdate:
                if (id.equalsIgnoreCase("")){
                    break;
                }
                Log.d(LOG_TAG, "---Update mytable---");
 
                cv.put("name", name);
                cv.put("email", email);
 
                int updCount = db.update("mytable", cv, "id = ?",
                        new String[] { id });
                Log.d(LOG_TAG, "upatet rows count = " +updCount);
                break;
            case R.id.btnDel:
                if (id.equalsIgnoreCase("")){
                    break;
                }
                Log.d(LOG_TAG, "---Deleted from mytable---");
 
                int delCount = db.delete("mytable", "id = " + id, null);
                Log.d(LOG_TAG, "deleted rows count =" + delCount);
                break;


AlexeyFedor
Сообщения: 31
Зарегистрирован: 03 сен 2013, 14:26

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение AlexeyFedor » 27 фев 2015, 16:43

Чисто просто из интереса. Можно или нет редактировать, удалять строку напрямую по позиции курсора.
Или только стандартный подход. Зная позицию курсора, надо вытащить ID строки, и уже по ID совершать действия.

AlexeyFedor
Сообщения: 31
Зарегистрирован: 03 сен 2013, 14:26

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение AlexeyFedor » 27 фев 2015, 17:53

Блин ПОМОЖИТЕ. Тормозю интенсивно. Все есть осталось правильно написать запрос на обновление, не доходит до мну никак. :evil:

Код: Выделить всё

                       int idRecordColIndex=cur.getColumnIndex("_id");
			int idRecord=cur.getInt(idRecordColIndex);//вытаскиваем ID записи
			//заполняем контейнер записями которые нужно изменить
			cv.put("engWord", etEngWord.getText().toString());//
			cv.put("rusWord", etRusWord.getText().toString());//
			cv.put("association", etAssociation.getText().toString());//
			if(cbVisible.isChecked()){
				cv.put("visible", "yes");
			}
			else {
				cv.put("visible", "no");
			}
			//как правильно выполнить запрос на обновление
			db.update("dictonary", cv, null,  null);

AlexeyFedor
Сообщения: 31
Зарегистрирован: 03 сен 2013, 14:26

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение AlexeyFedor » 28 фев 2015, 12:36

Отвечаю сам себе. Может кому пригодится.

Код: Выделить всё

int idRecordColIndex=cur.getColumnIndex("_id");
			int idRecord=cur.getInt(idRecordColIndex);//вытаскиваем ID записи
			//заполняем контейнер записями которые нужно изменить
			cv.put("engWord", etEngWord.getText().toString());//
			cv.put("rusWord", etRusWord.getText().toString());//
			cv.put("association", etAssociation.getText().toString());//
			if(cbVisible.isChecked()){
				cv.put("visible", "yes");
			}
			else {
				cv.put("visible", "no");
			}
			//как правильно выполнить запрос на обновление
			Log.d(MY_LOG, " ID строки которорую нужно изменить  = "+ idRecord);
			db.update("dictonary", cv, "_id=?",  new String[] { String.valueOf(idRecord)});
В моей голове никак не укладывалось, что значение _id в таблице имеет тип int, а запросе надо передавать строковое значение. Определенно надо почитать что то по SQL для чайников.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение Foenix » 28 фев 2015, 17:20

Чуть чуть не в тему, но хочу отметить, что это такая субд, в которой что int, что String - ты в столбец таблицы можешь что угодно записать - она не заругается. И второе - типы данных sqlite сильно ограничены в разнообразии. Есть только integer, real,text и blob
R.id.team

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

AlexeyFedor
Сообщения: 31
Зарегистрирован: 03 сен 2013, 14:26

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение AlexeyFedor » 01 мар 2015, 06:25

Foenix писал(а):Чуть чуть не в тему, но хочу отметить, что это такая субд, в которой что int, что String - ты в столбец таблицы можешь что угодно записать - она не заругается. И второе - типы данных sqlite сильно ограничены в разнообразии. Есть только integer, real,text и blob
Посоветуйте плз. Что можно почитать по SQL ну совсем для чайничков, не одаренных интелектом. Желательно чтобы картинок было побольше. :idea:

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение Foenix » 22 май 2015, 13:06

1 не сохранился. Это всего лишь число. На память не влияет. Не гарантировано что не будет вставлено ещё раз 1
2 БД сама по себе. Активити сами по себе.БД хэлпер отдельный класс сам по себе. Он создаёт базу. Для доступа используйте контент провайдер
R.id.team

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

Радислав Гандопас
Сообщения: 9
Зарегистрирован: 29 апр 2015, 09:47

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение Радислав Гандопас » 22 май 2015, 14:54

Вот такие вот 2 вопроса:
1) Представим что я добавил запись в таблицу, она получила id=1. После удаления этой записи из таблицы (то есть после нажатия кнопки Delete),первая запись удалилась, добавляю другую запись. После считываю то что есть в таблице, а есть там только вторая запись под id =2. Вопрос в том почему первой записи больше не существует, а ее id сохранился где-то в памяти и последующие записи уже никогда не получат id=1 даже если все предыдущие записи будут удалены. Это ведь повлияет на то как постепенно приложение будет откусывать все больше памяти системы себе?

2) Можно каким-нибудь образом создать базу данных в одном активити, а содержимое читать в другом?

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение Foenix » 22 май 2015, 15:43

ответила же. Что не ясно?
R.id.team

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

dmitry_n
Сообщения: 7
Зарегистрирован: 06 июн 2015, 13:47

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение dmitry_n » 10 июл 2015, 22:24

Кто-нибудь знает, куда сохраняются файлы с записями БД или Shared Preferences при работе с эмулятором Genymotion? Я нашел только общий файл с логами.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение Foenix » 11 июл 2015, 02:12

знаем ;)
R.id.team

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

Аватара пользователя
doter.ua
Сообщения: 1106
Зарегистрирован: 23 ноя 2013, 16:08
Откуда: Ukraine

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение doter.ua » 11 июл 2015, 08:30

dmitry_n писал(а):Кто-нибудь знает, куда сохраняются файлы с записями БД или Shared Preferences при работе с эмулятором Genymotion? Я нашел только общий файл с логами.
http://stackoverflow.com/a/20336819
Семь раз отмерь - поставь студию.
Эклипс не студия, ошибка вылетит - не исправишь.
Скажи мне кто твой друг, и оба поставили студию.
Студия - свет, а эклипс - тьма.

Bofyr
Сообщения: 1
Зарегистрирован: 16 июл 2015, 23:00

Re: Урок 35. SQLite. Методы update и delete с указанием усло

Сообщение Bofyr » 16 июл 2015, 23:05

"Обратите внимание, что условия и для update и для delete у меня одинаковые, а именно id = значение из поля etID. Но реализовал я их немного по-разному. Для update использовал символ ? в строке условия и массив аргументов. А для delete вставил значение сразу в строку условия. Таким образом, я просто показал способы формирования условия. А вы уже используйте тот, что больше нравится или лучше в конкретной ситуации."
Первый способ ( id = значение из поля etID) подходит только для Integer значений. Если таким способом передать String то будет ошибка NoSuchColumnExcaption :
http://stackoverflow.com/questions/1682 ... uch-column

Ответить