Правильный подход для управления базой данных

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Правильный подход для управления базой данных

Сообщение Foenix » 26 янв 2014, 13:24

m090050 писал(а):В принципе понял, спасибо. Кстати, была ли необходимость работать с базой с двух процессов?
при использовании контент-провайдера - хоть с тыщи процессов - он это дело сам регулирует. КРоме того, при использовании лоадеров - не нужно создавать явный поток, т.к. загрузка происходит асинхронно.

altwin, так и не поняла - то ли есть у тебя база данных на устройстве, то ли нету..
я вообще ничего не храню на устройстве
если я что то делаю с базой непосредственно в Android - по максимуму использую SQL
это делаю с сервера, далее в Android
на устройстве база в основном динамическая
Можно пояснить, что ты имеешь ввиду под "базой" на устройстве?
R.id.team

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

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Правильный подход для управления базой данных

Сообщение altwin » 26 янв 2014, 13:36

m090050 писал(а): 1. А пишешь через интерфейс к существующему API андроида или на более низком уровне? ORM же получается медленней работает, нежели с курсором. Или спасает то, что в основном работа с базой идет на серверной стороне?
2. Динамическая это когда в ОЗУ данные загружаются с базы?
1. Скорее всего да, потому, что основная логика на сервере я не замечал проблем со скростью, на и этот ORM по сути объект имеющий поля соответсвующие полям в базе и методы selectFromDb/incertInDb, , и updateDB, который наиболее полезен в случае с sqlite, поскольку по сути приходится удалять/вставлять. Да и откуда тормоза, если в этих методах формируется SQL запрос. А Cursor -ом удобно выбирать и формировать view. Важна оптимизация структуры под задачу.
2. Не совсем, просто к примеру частный случай: формируя listview я загружаю 100 объектов в базу, 10 из которых в поле visible_status имеют true, остальные false.(отображаются или нет), а в принципе грузятся в UI или нет. Моя задача менять статус при скроле и писать лог, который опять таки идет на сервер в mongo. При этом фоном работает сервис, задача которого не только грузить новые объекты(в памяти держу около 10), но и следить за событием в UI, т.е. если пользователь убрал из представления новость - она удаляется(самая затратная операция если выбрал новость в середине..), в том числе из хеша или если просто грузит новые - первые выталкиваются а сервис сохраняет инфу о том, что те, вытолкнутые в хеше, чтобы не грузить их. Таким образом в результате в базе всегда 100 объектов(ну или другое известное число), хранимые объекты в хеше известны сервису, который помимо загрузки в стек новых, проверяет актуальность текущих.
Изображение

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Правильный подход для управления базой данных

Сообщение altwin » 26 янв 2014, 13:38

Foenix писал(а): Можно пояснить, что ты имеешь ввиду под "базой" на устройстве?
Ну я уже ответил, на устройстве хранятся данные загруженные с сервера, но уже обработанные и готовые к выдаче в view. По сути в идеале я стремлюсь к тому, чтобы запрос вида select * из базы устройства выдавал корректный результат не нуждающийся в фильтрах.
Данимаческая в данном случае, имеющая точное число записей которые обновляются.
Изображение

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

Re: Правильный подход для управления базой данных

Сообщение Foenix » 26 янв 2014, 13:54

altwin писал(а):
Foenix писал(а): Можно пояснить, что ты имеешь ввиду под "базой" на устройстве?
Ну я уже ответил, на устройстве хранятся данные загруженные с сервера, но уже обработанные и готовые к выдаче в view. По сути в идеале я стремлюсь к тому, чтобы запрос вида select * из базы устройства выдавал корректный результат не нуждающийся в фильтрах.
Данимаческая в данном случае, имеющая точное число записей которые обновляются.
тогда у тебя по второму пункту выше - разница все-таки есть. Все используют "стандартный курсор" - кака разница выбирать его запросом select * или посложнее - никакой.
Поэтому даже если бы мне нужно было выбирать select * я бы использовала контент-провайдеры. Дело не в простоте запроса..
В общем, я все это самые выжимки из статей в интернете говорила на вебинаре. И почему нужно переходить на контент-провайдеры тоже.
R.id.team

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

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Правильный подход для управления базой данных

Сообщение altwin » 26 янв 2014, 14:03

Foenix писал(а):
altwin писал(а):
Foenix писал(а): Можно пояснить, что ты имеешь ввиду под "базой" на устройстве?
Ну я уже ответил, на устройстве хранятся данные загруженные с сервера, но уже обработанные и готовые к выдаче в view. По сути в идеале я стремлюсь к тому, чтобы запрос вида select * из базы устройства выдавал корректный результат не нуждающийся в фильтрах.
Данимаческая в данном случае, имеющая точное число записей которые обновляются.
тогда у тебя по второму пункту выше - разница все-таки есть. Все используют "стандартный курсор" - кака разница выбирать его запросом select * или посложнее - никакой.
Поэтому даже если бы мне нужно было выбирать select * я бы использовала контент-провайдеры. Дело не в простоте запроса..
В общем, я все это самые выжимки из статей в интернете говорила на вебинаре. И почему нужно переходить на контент-провайдеры тоже.
Я бы не сказал, что разницы нет. SQLite не очень то позволяет оптимизировать запросы и выполняя транзакционные запросы к базе с десятком inner join в каждом я не совсем представляю, что мне делать, если бы к примеру я был в Android и пытался забрать это из sqlite вместо postgre. В этом конкретном случае у меня есть таблицы пользователей и групп, 7 уровней прав, отдельные таблицы для фото, комментариев, заметок и задач пользователей, таблица в которой ведется индексация записей в лог mongo от этого пользователя и еще много всего. Я просто не могу поместить всю структуру в sqlite. Я не совсем понимаю смысла Использовать "контент провайдер", поскольку мне придется думать над логикой в двух местах, на сервере и в Android, по сути же я просто избавляю себя от головной боли на одной стороне. Хотя наверно да - особой разницы какой сложности запрос выполнять нет. Но почему то мне кажется select * без фильтров отработает быстрей контент провайдера, как минимум, выгода в том, что нет лишнего объекта.
Изображение

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

Re: Правильный подход для управления базой данных

Сообщение Foenix » 26 янв 2014, 14:19

ты смешиваешь все в кучу, речь идет только о локальных данных. Я не гвоорила, что твоя логика неправильная (скорее всего она верная, т.к. лучше заставить работать сервер и вычислятЬ, чем устройство - это и дураку понятно), я говорила, что использовать контент провайдер в работе с локальной sqlite лучше (речь веду только о локальных запросах!). Что же касается скорости, уверяю тебя, у меня таблицы были и покруче и запросы достигают порой длинны в половину экрана с кучей join разной сложности, сортировок и выборок (работаю с таблицами товаров их свойств, номенклатур и прочего), объединяя их штук по 10 в одном запросе, фильтруя и так далее (в таблице товаров ок 100 тыс записей). При переходе на к.п. никакого замедления не обнаружено - я уверена, что скорость одинаковая и определяется запросом, а не контент-провайдер или сингтон старый подход). sqlite быстрая бд, что очень приятно. Поэтому не нужно об этом распространять какие-либо слухи и домыслы.
То же касается оптимизации запросов. Оптимизировать их можно и нужно и на серверах и на локали.
R.id.team

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

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Правильный подход для управления базой данных

Сообщение altwin » 26 янв 2014, 15:36

Foenix писал(а):ты смешиваешь все в кучу, речь идет только о локальных данных. Я не гвоорила, что твоя логика неправильная (скорее всего она верная, т.к. лучше заставить работать сервер и вычислятЬ, чем устройство - это и дураку понятно), я говорила, что использовать контент провайдер в работе с локальной sqlite лучше (речь веду только о локальных запросах!). Что же касается скорости, уверяю тебя, у меня таблицы были и покруче и запросы достигают порой длинны в половину экрана с кучей join разной сложности, сортировок и выборок (работаю с таблицами товаров их свойств, номенклатур и прочего), объединяя их штук по 10 в одном запросе, фильтруя и так далее (в таблице товаров ок 100 тыс записей). При переходе на к.п. никакого замедления не обнаружено - я уверена, что скорость одинаковая и определяется запросом, а не контент-провайдер или сингтон старый подход). sqlite быстрая бд, что очень приятно. Поэтому не нужно об этом распространять какие-либо слухи и домыслы.
То же касается оптимизации запросов. Оптимизировать их можно и нужно и на серверах и на локали.
Ну значит попробую, раз это Android way наверно так будет правильней, если новых проблем не возникает.
Изображение

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

Re: Правильный подход для управления базой данных

Сообщение Foenix » 26 янв 2014, 15:55

там подход другой. к нему приспособиться надо. А чего не возникает - так это желания вернуться обратно на старый способ.
R.id.team

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

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Правильный подход для управления базой данных

Сообщение altwin » 26 янв 2014, 16:32

Foenix писал(а):там подход другой. к нему приспособиться надо. А чего не возникает - так это желания вернуться обратно на старый способ.
Ну это не проблема, я еще не настолько динозавр, чтобы считать свои решение на столько верными, чтобы не пробывать новое :) Главное понять чем это лучше, потому как банальный проход циклом выполняя select по id в таблице по порядку и сохранение каждой строки в "фабричный" объект, на столько примитивно просто, что попытка передать менее подготовленные данные и выполнить более сложный запрос может не много напугать... хотя ради того, чтобы заявить о использование нового подхода заказчику - попробывать точно стоит :)
Изображение

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

Re: Правильный подход для управления базой данных

Сообщение Foenix » 26 янв 2014, 16:48

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

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

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Правильный подход для управления базой данных

Сообщение altwin » 26 янв 2014, 17:04

Foenix писал(а):я с этим подходом не знакома вообще, можно кусочек кода посмотреть - тот, который ты описываешь (проход циклом)
Мне проще попытаться объяснить, чем искать пример кода и править его в понятный вид. Т.е. есть класс, в конструктор которого передаются парраметры соединения с бд, он циклом проходит по подготовленной таблице select -ом и выдает массив объектов самого себя, каждый объект - строка в базе. Далее обращение просто через get/set <имя_поля>(Obj[0].getName()), или же просто вызов toString(), который и решает вопрос select *, т.е. отдает сформированный ответ.

P.S. я не уверен, что это можно назвать подходом... поскольку не читал об этой :) просто мне показалось, что так делать удобно...
Изображение

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

Re: Правильный подход для управления базой данных

Сообщение Foenix » 26 янв 2014, 17:51

стоп. а раньше ты про курсоры говорил. И где курсор у тебя используется?
R.id.team

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

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

Re: Правильный подход для управления базой данных

Сообщение Foenix » 26 янв 2014, 17:52

циклом проходит по подготовленной таблице select -ом
так не бывает. Что-то не то.
R.id.team

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

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Правильный подход для управления базой данных

Сообщение altwin » 26 янв 2014, 17:58

Foenix писал(а):
циклом проходит по подготовленной таблице select -ом
так не бывает. Что-то не то.
в смысле? поля базы передаются в конструктор, _id в данном случае используется в итерации, обычный инкремент позволяет пройти все по порядку, если целостость базы нарушенна и _id пропущенна - просто continue.

P.S> как бы да id - по порядковому номеру, при необходимости можно использовать не id, а любое поле, просто в select ... where <_id>. Ничего не мешает конструктору принимать имя/пароль к дб, массив имен колонок, и поле по которому идет инкремент.
Изображение

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Правильный подход для управления базой данных

Сообщение altwin » 26 янв 2014, 18:08

Foenix писал(а):стоп. а раньше ты про курсоры говорил. И где курсор у тебя используется?
курсор для выборки без формирования всего пула объектов, в том же фоновом потоке, существует колонка в которой в случае установки флага в true создается запись в лог, чтобы не дергать объект из разных мест одновременно тем более для простой задачи, я просто вытаскиваю курсором имя, штамп времени и остальное нужно, в любом случае соединение с базой я открываю один раз для создания объектов, далее это происходит без моего вмешательства, т.е. на все объекты получишвшие флаг true в стеке открывается соединение/забирается нужное/пишется, но процессом не связанным с основным и только одним.
И да, может я что то и не так делаю, но чтобы пройти циклом по базе мне как раз курсор нужен.
P.S. главный баг, который в данном случае для меня фича в том, что для cursor соединение никогда не закрывается, а вот флаг он считывает с объекта, но запись в базе не меняет, т.е. эта колонка в базе на сервере отличается от реальной ситуации в устройстве и до тех пока не будет вызван метод явного сохранения, все изминения статусов обратимы без обращения к серверу.

Ну и как бы я описывал изначально то, как стараюсь использовать базу и конкретный случай, это не значит, что я всегда использую все, что можно. Иногда просто быстрей взять курсор а не думать над логикой объектов.
Последний раз редактировалось altwin 26 янв 2014, 18:32, всего редактировалось 1 раз.
Изображение

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Правильный подход для управления базой данных

Сообщение anber » 26 янв 2014, 18:24

Foenix писал(а): лучше заставить работать сервер и вычислятЬ, чем устройство - это и дураку понятно
интересная мысль.
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Правильный подход для управления базой данных

Сообщение altwin » 26 янв 2014, 18:29

Меня почему то контент провайдер сразу пугает тем,что не только нельзя отследить прогресс, но и остановить его нельзя. А как быть если нет соединения с сервером или ошибка авторизации, получается я могу вызвать его, но о этой ошибке мне никто не скажет, только проверка на null и вся информация... Как бы не очень интересная штука.
Изображение

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

Re: Правильный подход для управления базой данных

Сообщение Foenix » 26 янв 2014, 18:29

anber писал(а):
Foenix писал(а): лучше заставить работать сервер и вычислятЬ, чем устройство - это и дураку понятно
интересная мысль.
это все, что я говорила интересного??? :shock:
:mrgreen: :mrgreen: :mrgreen:
R.id.team

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

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

Re: Правильный подход для управления базой данных

Сообщение Foenix » 26 янв 2014, 18:31

altwin писал(а):Меня почему то контент провайдер сразу пугает тем,что не только нельзя отследить прогресс, но и остановить его нельзя. А как быть если нет соединения с сервером или ошибка авторизации, получается я могу вызвать его, но о этой ошибке мне никто не скажет, только проверка на null и вся информация... Как бы не очень интересная штука.
але... с каким сервером?? мы таки щас о чем?
R.id.team

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

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

Re: Правильный подход для управления базой данных

Сообщение Foenix » 26 янв 2014, 18:34

altwin писал(а):
Foenix писал(а):
циклом проходит по подготовленной таблице select -ом
так не бывает. Что-то не то.
в смысле? поля базы передаются в конструктор, _id в данном случае используется в итерации, обычный инкремент позволяет пройти все по порядку, если целостость базы нарушенна и _id пропущенна - просто continue.

P.S> как бы да id - по порядковому номеру, при необходимости можно использовать не id, а любое поле, просто в select ... where <_id>. Ничего не мешает конструктору принимать имя/пароль к дб, массив имен колонок, и поле по которому идет инкремент.
ох как сложно это все воспринимать, осоенно когда лексика не одинаковая!
"пройти по порядку" что?
причем тут _id причем тут пропуски? эй
ох
если вот это
select ... where <_id>
у тебя в цикле по _id
если это действительно так, как ты пишешь, то это ой-ой-ой какой ужасно неправильный и катастрофически медленный способ, что я просто тут не знаю что сказать даже.
R.id.team

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

Ответить