Неограниченные возможности ContentProvider

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Неограниченные возможности ContentProvider

Сообщение rezak90 » 01 сен 2013, 12:30

Всем привет! Вот никогда не пользовался ContentProvider'ом, решил попробовать. Понравился сам подход, всё классно но как всегда возникло одно НО.
ContentProvider по умолчанию обязательными методами для переопределения являются delete, getType, insert, onCreate, query, update. Вот а мне допустим нужно сделать "insert or replace" или скажем добавить свой метод, не важно какой. Вроде как и добавил но обращаемся к провайдеру мы через ContentResolver по Uri, и соответственно я могу обратится только к стандартным методам базового ContentProvider'а а не к тем методам что я дописал.
Так что я ошибаюсь и есть выход? Или работа с ContentProvider'ом действительно такая ограниченная?
R.id.team
Политика на форуме запрещена

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

Re: Неограниченные возможности ContentProvider

Сообщение Foenix » 01 сен 2013, 19:05

Слава, да, работа ограниченная данными методами.

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

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

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Неограниченные возможности ContentProvider

Сообщение rezak90 » 01 сен 2013, 19:58

Foenix писал(а):Слава, да, работа ограниченная данными методами.

Смотри на параметр, который тебе нужно возвратить. Например, когда идет апдейт или инсерт - то там количество записей по-моему возвращается, можно совместить, если реплейс или инсерт - придется выбрать где тебе разместить данный метод, и придется вернуть фейковый uri, например (тот, который пришел на входе).
Свои методы вписывать и вызывать нельзя.
ты и там успеваешь заходить в интернет? Тогда вопрос, смысл в ContentProvider'e если он такой ограниченный?
R.id.team
Политика на форуме запрещена

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

Re: Неограниченные возможности ContentProvider

Сообщение Foenix » 01 сен 2013, 22:31

Я тут без рук, без ног да еще и без головы :shock:
интернет есть, но времени на него нету)

Пользу от него я вижу только в том, что с ним можно работать с курсорлоадером (к.л. может без к.п. но с велосипедом).
Сама реализация, особенно при большом количестве таблиц получается громоздкой и неизящной :( Но у меня есть метод, где я или удаляю или добавляю или редактирую строку в зависимости от данных. Получилось что нужно было возвращать тот же ури что и на входе, не считаю это правильным, если честно, но другого выхода не вижу.
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: Неограниченные возможности ContentProvider

Сообщение Foenix » 01 сен 2013, 22:37

гугл зарапортовался. Вначале сказал, что если не будете шарить базу, то к.п. вам не нужен, и вообще он нужен в исключительных случаях. Затем изобрел к.л. и объявил вне закона startmanagingcursor и requery(). А к.л. без к.п. смысла особого нет использовать.
Зато загрузка к.л.-ом данных в списки мне даже визуально нравится больше.
R.id.team

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

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Неограниченные возможности ContentProvider

Сообщение neoksi » 01 сен 2013, 23:33

rezak90 писал(а):Всем привет! Вот никогда не пользовался ContentProvider'ом, решил попробовать. Понравился сам подход, всё классно но как всегда возникло одно НО.
ContentProvider по умолчанию обязательными методами для переопределения являются delete, getType, insert, onCreate, query, update. Вот а мне допустим нужно сделать "insert or replace" или скажем добавить свой метод, не важно какой. Вроде как и добавил но обращаемся к провайдеру мы через ContentResolver по Uri, и соответственно я могу обратится только к стандартным методам базового ContentProvider'а а не к тем методам что я дописал.
Так что я ошибаюсь и есть выход? Или работа с ContentProvider'ом действительно такая ограниченная?
Слава, все ограничивается фантазией разработчика. ;)
К примеру "insert or replace" ты можешь реализовать в методе insert, просто определяя спец Uri для таких запросов и обрабатывая их иначе.
А так же там есть переопределяемый метод public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations)..., через который можно делать множество запросов в одной транзаксации.

П.С. Да свои методы там нет возможности создать, чтоб достучаться через стандартные механизмы, но внутри существующих методов, можно варьироваться, хватило бы фантазии.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Неограниченные возможности ContentProvider

Сообщение rezak90 » 02 сен 2013, 00:22

neoksi писал(а):Слава, все ограничивается фантазией разработчика. ;)
К примеру "insert or replace" ты можешь реализовать в методе insert, просто определяя спец Uri для таких запросов и обрабатывая их иначе.
А так же там есть переопределяемый метод public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations)..., через который можно делать множество запросов в одной транзаксации.

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

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Неограниченные возможности ContentProvider

Сообщение neoksi » 02 сен 2013, 00:43

rezak90 писал(а):та я так сразу и сделал... но мне такое не нравится что приходится куеву тучу гарадить, потому что база может быть же и не маленькая, и по этому как то мне такая реализация не нравится
Ну все зависит от того как ты строишь саму логику работы с БД. У меня операции типа "insert or replace" возникают обычно при загрузке множества новых данных в БД. Поэтому я все делаю через метод applyBatch, сначала передаю в него селекты для проверки наличия данных, а далее по результатам отправляю пачку запросов insert и update. Вообще такие операции нежелательно делать внутри самого CP, он должен отвечать только за связь с БД. Вариации работы с данными должны быть классом выше, и реализованы в классе, который вызывает CP. Желание сократить код в Java, это как себе же подножку делать в будущем ;).

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Неограниченные возможности ContentProvider

Сообщение rezak90 » 02 сен 2013, 01:10

Та просто как то сразу негативное мнение о ContentProvider'e возникло, своего мало что напишешь, только нужно в рамки втиснуться... не люблю когда ущемляют в правах :)
R.id.team
Политика на форуме запрещена

Idol
Сообщения: 55
Зарегистрирован: 26 июн 2013, 04:33

Re: Неограниченные возможности ContentProvider

Сообщение Idol » 02 сен 2013, 07:28

neoksi,
Как вовремя вы про applyBatch затронули.
Недавно наваял кусок кода, где обновляются данные для списка (всего списка). Естественно все это получилось с циклом. Решил улучшить производительность и завернул все это в одну транзакцию (т.е. использовал applyBatch).
Однако, сравнение методов обновления не выевело какого-либо существенного преимущества.
На 100 элементном списке
1) метод без applyBatch занимает от 40 до 80 мсек на запись
2) метод с applyBatch от 30 до 60
Конечно, эти цифры относительные, да и тригер на таблице висит, но все же берут меня сомнения, что applyBatch метод шибко выгоден в плане производительности. Да и дополнительную память ест на свои методы.

Есть ли какая-нибудь инфа по производительности applyBatch? Поделитесь пожалуйста.

PS если не сложно, направьте в правильную сторону, как определить куда тратится время при подобных операциях (использую Эклипс).

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Неограниченные возможности ContentProvider

Сообщение neoksi » 02 сен 2013, 08:18

Idol,

Когда мы используем одну транзакцию, то мы уменьшаем кол-во операций чтения-записи файла БД. Тобишь он читается один раз, а не 100 для 100 записей. Чем больше строк, тем заметнее результат. Для меня время сократилось существенно, но я не засекал с секундомером. А вообще, чтоб выяснить скорость работы обоих методов, нужно взять метку времени до начала цикла и отнять ее от метки времени после окончания цикла, результат можно вывести в лог. Таким образом вы получите реальное время выполнения цикла в одном и в другом случае. Чисто ориентироваться на логи нельзя, так как прерывания на вывод логов тоже происходят с определенными интервалами, примерно раз в 5-10мс.

Idol
Сообщения: 55
Зарегистрирован: 26 июн 2013, 04:33

Re: Неограниченные возможности ContentProvider

Сообщение Idol » 02 сен 2013, 13:14

neosk,
Спасибо за ответ.
Я вроде тоже не с секундомером сидел :). Конечно, вывод в лог. И для сравнения подобных операций задержки на работу с логами не имеют значения.

Клясться не буду, но если мне не изменяет память, то не количество операций IO файла бд существенно уменьшает время исполнения транзакции, а работа с лог файлом, локи и количество подключений к бд.

На каких объемах ты использовал applyBatch?

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Неограниченные возможности ContentProvider

Сообщение neoksi » 02 сен 2013, 18:37

Idol

У меня число операций не статично, так что я не могу точно сказать, в некоторых 50, а в других 1500.

П.С. При замере времени работы цикла, если вы будите ориентироваться на время появления записи лога, то данные будут неверны. Нужно засекать в самом цикле и полученный результат уже выводить в лог.

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

Re: Неограниченные возможности ContentProvider

Сообщение Foenix » 02 сен 2013, 18:39

Idol, причем тут applybatch если там главное использовать транзакцию? Если ты ее используешь, то время сокращается. У меня 90 тыс записей каждый день скачивается в одной из таблиц, не считая других. Занимает сносное время, точно уже не помню. Но эксперименты с транзакцией и без нее делала - в логи выкладывала время, без использования транзакций - это нереально ждать.
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: Неограниченные возможности ContentProvider

Сообщение Foenix » 02 сен 2013, 18:44

rezak90 писал(а):Та просто как то сразу негативное мнение о ContentProvider'e возникло, своего мало что напишешь, только нужно в рамки втиснуться... не люблю когда ущемляют в правах :)
ну вот, а вы смеялись, когда я долго с ними разбиралась. У меня нужно было в эти три метода впихнуть своих 60. Причем некоторые содержали транзакцию например, по добавлению строк в несколько таблиц. Я была в шоке. Тем более что в интернете все примеры содержат работу только с 1 таблицей - 99.9%. Разработчики на стеке вообще отвечали расплывчато "it depends" на вопрос как работать хотя бы с двумя таблицами. Андроид вообще не предназначен, я так поняла, для сколько нибудь серьезной работы с данными.

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

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

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Неограниченные возможности ContentProvider

Сообщение rezak90 » 02 сен 2013, 19:16

Foenix писал(а):ну вот, а вы смеялись, когда я долго с ними разбиралась.
я и до сих пор смеюсь :D
У меня не возникает трудностей с ним и не понимания. Просто мне не понятна сама архитектура, ведь в таком чистом виде ContentProvider нужен только на примитивном банальном и скучном уровне. Ведь для 99% проектов он тогда не логичен. А писать кучу настроек под него ну это лишнее время и велосипеды, уж проще тогда тупо все методы реализовывать в SQLiteOpenHelper'e и делать его синглтоном. Да криво, но не более чем ContentProvider, зато гибко и легко использовать.
Foenix писал(а):У меня нужно было в эти три метода впихнуть своих 60. Причем некоторые содержали транзакцию например, по добавлению строк в несколько таблиц. Я была в шоке. Тем более что в интернете все примеры содержат работу только с 1 таблицей - 99.9%. Разработчики на стеке вообще отвечали расплывчато "it depends" на вопрос как работать хотя бы с двумя таблицами. Андроид вообще не предназначен, я так поняла, для сколько нибудь серьезной работы с данными.
а никто не запрещает тебе писать обычный sql запрос, в нём хоть 10 таблиц связывай.
R.id.team
Политика на форуме запрещена

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

Re: Неограниченные возможности ContentProvider

Сообщение Foenix » 02 сен 2013, 19:34

ну с себя посмейся, я тебе ту же проблему описываю - нелогично и негибко в коде.

Причем тут связывание 10 таблиц? дело не в связывании а в том, что если подходить к проблеме прямо, то в каждом из трех даденых гуглом методов нужно делать свитч на 40 позиций, в каждом из которых связывать по 10 таблиц? красота неописуемая.
поэтому я придумывала способ, чтоб все это было не в 1 методе длиной 100 км, а так, чтоб потом через год в этом разобраться можно было.

что же касается хэлпера - я уже говорила о к.л.-ах, с которым нужен к.п.
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: Неограниченные возможности ContentProvider

Сообщение Foenix » 02 сен 2013, 19:37

ты сам посмотри, делаешь кучу пакетов в 1 проекте - и смеешься, если у меня всего 1 пакет. Но запихивать в 1 свитч 100500 методов обработки базы в 10 таблиц - это то же самое, что делать проект без пакетов внутри где 100500 классов в куче.
R.id.team

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

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Неограниченные возможности ContentProvider

Сообщение rezak90 » 02 сен 2013, 19:44

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

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Неограниченные возможности ContentProvider

Сообщение rezak90 » 02 сен 2013, 19:45

Foenix писал(а):ты сам посмотри, делаешь кучу пакетов в 1 проекте - и смеешься, если у меня всего 1 пакет. Но запихивать в 1 свитч 100500 методов обработки базы в 10 таблиц - это то же самое, что делать проект без пакетов внутри где 100500 классов в куче.
у меня такое ощущение что ты никуда не уехала, а просто сидишь и пытаешься тролить, а в скайп не заходишь что бы тебя не затролили :roll:
R.id.team
Политика на форуме запрещена

Ответить