|
Вопрос матёрого новичка про доступ к БД из разных объектов
|
|||
---|---|---|---|
#18+
Большинство примеров в книгах и интернете советуют создавать CRUD-функции прямо в классе, унаследованном от SQLiteOpenHelper (у меня этот класс называтся CustomSQLiteOpenHelper), сразу после onCreate и onUpgrade. Для меня это неприемлемо - для каждой сущности (например, Emp, Dept и т.д.) я хочу создавать отдельные классы для операций с БД (например, EmpCrud, DeptCrud и т.д.) - вместо того, чтобы сваливать всё в одну немыслимую кучу внутри CustomSQLiteOpenHelper. Каждая CRUD-функция в этих классах должна иметь доступ к базе данных, т.е. поинтер на объект класса SQLiteDatabase (через который будут вызываться rawQuery(), insert() и т.п.). Есть два варианта как этот поинтер организовать - хотелось бы услышать от знатоков любые за и против касаемо каждого. Вариант номер 1: Каждая Activity создаёт для себя экземпляр SQLiteDatabase и передаёт его в качестве аргумента при создании экземпляров ХххCrud классов. Например, в классе EmpActivity объявляем следующие пропертиз: Код: java 1. 2. 3.
Соответственно, в EmpActivity.onStop() пишем: Код: java 1.
Вариант номер 2: Каждый ХххCrud класс наследуется от CustomSQLiteOpenHelper, например: Код: java 1. 2. 3.
Тогда наследники будут просто иметь экземпляр SQLiteDatabase внутри себя: Код: java 1. 2. 3. 4. 5. 6. 7.
Как известно, эти пропертиз - вызовы функций getWritableDatabase и getReadableDatabase, которые при первом к ним обращении создают соединение и размещают его в кеше, а затем возвращают его при последующих вызовах. Соединение должно быть закрыто в конце работы аппликации, для чего добавляем в функцию CustomSQLiteOpenHelper.close(): Код: java 1. 2.
Затем в каждом Activity создаём экземпляр соответствующего ХххCrud класса. Например, в EmpActivity объявляем: Код: java 1.
Недостатком варианта номер 2 видится то, что ХххCrud классы будут тяжеловесней (т.к. уинхерят все поля предка). Но зато меньше писанины (тем более что эта писанина - голимый code duplication). 99% сайтов (и 100% прочитанных мною книг) предлагают не его, а пихать всё в одну кучу внутри CustomSQLiteOpenHelper, а ХххCrud классы вообще не создавать (намного реже - метод номер 1, а метод 2 вообще можно искать со свечкой). В своей "тренировочной" аппликации я использую метод 2, но как-то странно, что "нас так мало" - возможно, я чего-то не вижу. Хотелось бы услышать мнение зубров. Лишь добавлю, что я только начал имплеметировать, и аппликацию пока не запускал, так что все приведённые примеры кода ещё не проверялись (наверняка что-то не учёл, но для иллюстрации вопроса сойдёт). ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2019, 16:28 |
|
Вопрос матёрого новичка про доступ к БД из разных объектов
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2019, 09:04 |
|
Вопрос матёрого новичка про доступ к БД из разных объектов
|
|||
---|---|---|---|
#18+
pand, Спасибо! Напоминает MyBatis, с которым мне приходилось иметь дело. В чём именно его удобство? И в чём неудобство (или потенциальные проблемы) прямого вызова функций класса SQLiteOpenHelper? Это практический вопрос, а не спор, если чё. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2019, 19:59 |
|
Вопрос матёрого новичка про доступ к БД из разных объектов
|
|||
---|---|---|---|
#18+
Ursego, room это orm которая избавляет от рутины парсить резалт сеты и параметры. можно использовать в связке с RxAndroid. насколько я помню можно получить доступ к контексту базы и работать как с dbHelper.writableDatabase если есть необходимость или желание . из минусов рума - использование рефлексии ( минус на любителя ) . ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2019, 22:00 |
|
Вопрос матёрого новичка про доступ к БД из разных объектов
|
|||
---|---|---|---|
#18+
pand, thanx! ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2019, 22:01 |
|
Вопрос матёрого новичка про доступ к БД из разных объектов
|
|||
---|---|---|---|
#18+
Ursego, А чего Вы просто не используете паттерн Singelton. У меня Sqlhelper как у Вас...Но дальше я базу раздаю singeltonОМ Код: java 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 14:04 |
|
Вопрос матёрого новичка про доступ к БД из разных объектов
|
|||
---|---|---|---|
#18+
irbis_al, В догонку Существующий заполненный SQLite файл скомпилировать(сбуилдить) в apk (Андроид Студио) Тут весь код.(В ветке sqlite) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2019, 14:12 |
|
Вопрос матёрого новичка про доступ к БД из разных объектов
|
|||
---|---|---|---|
#18+
irbis_al, это решение всё равно бы поощряло дублирование кода - копипейст цвёл бы и пах. Я решил сделать иначе - запихал повторяющийся код в generic functions, а конкретные model-классы поставляют ему "уникальную" для них информацию, переопределяя функции extractContentValues() и populateFromCursor() интерфейса Crudable, которые все model-классы обязаны имплементировать. Это ещё не окончательный вариант, а скорее первичный набросок, который её допиливать и допиливать - можете глянуть здесь . Буду рад если опытные коллеги подправят или подкинут идей. Если довести до ума, то можно таскать за собой из проекта в проект. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 05:57 |
|
Вопрос матёрого новичка про доступ к БД из разных объектов
|
|||
---|---|---|---|
#18+
Ursego irbis_al, это решение всё равно бы поощряло дублирование кода - копипейст цвёл бы и пах. Я решил сделать иначе - запихал повторяющийся код в generic functions, а конкретные model-классы поставляют ему "уникальную" для них информацию, переопределяя функции extractContentValues() и populateFromCursor() интерфейса Crudable, которые все model-классы обязаны имплементировать. Это ещё не окончательный вариант, а скорее первичный набросок, который её допиливать и допиливать - можете глянуть здесь . Буду рад если опытные коллеги подправят или подкинут идей. Если довести до ума, то можно таскать за собой из проекта в проект. Вот вообще нет ни разу дублирование кода... Е Код: plsql 1. 2. 3.
С концепцией по ссылке я не согласен.(Это тоже не истина в последней инстанции,просто какой-то разработчик решил ,что так будет лучше для всех) Когда Я писал на java ..я делал класс который рисует ListView и от него наследовался. Сейчас я пишу на Flutter и сделать это намного на нём проще и изящнее. Вот тут https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1319817&msg=22032806 Обсуждалось можно посмотреть видео Flutter и код. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2019, 10:50 |
|
Вопрос матёрого новичка про доступ к БД из разных объектов
|
|||
---|---|---|---|
#18+
irbis_al Вот вообще нет ни разу дублирование кода... irbis_al С концепцией по ссылке я не согласен. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.12.2019, 02:10 |
|
|
start [/forum/topic.php?fid=13&fpage=3&tid=1330773]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
50ms |
get tp. blocked users: |
2ms |
others: | 249ms |
total: | 382ms |
0 / 0 |