powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / Android [игнор отключен] [закрыт для гостей] / Вопрос матёрого новичка про доступ к БД из разных объектов
10 сообщений из 10, страница 1 из 1
Вопрос матёрого новичка про доступ к БД из разных объектов
    #39902683
Фотография Ursego
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большинство примеров в книгах и интернете советуют создавать CRUD-функции прямо в классе, унаследованном от SQLiteOpenHelper (у меня этот класс называтся CustomSQLiteOpenHelper), сразу после onCreate и onUpgrade. Для меня это неприемлемо - для каждой сущности (например, Emp, Dept и т.д.) я хочу создавать отдельные классы для операций с БД (например, EmpCrud, DeptCrud и т.д.) - вместо того, чтобы сваливать всё в одну немыслимую кучу внутри CustomSQLiteOpenHelper.

Каждая CRUD-функция в этих классах должна иметь доступ к базе данных, т.е. поинтер на объект класса SQLiteDatabase (через который будут вызываться rawQuery(), insert() и т.п.). Есть два варианта как этот поинтер организовать - хотелось бы услышать от знатоков любые за и против касаемо каждого.

Вариант номер 1:

Каждая Activity создаёт для себя экземпляр SQLiteDatabase и передаёт его в качестве аргумента при создании экземпляров ХххCrud классов. Например, в классе EmpActivity объявляем следующие пропертиз:

Код: java
1.
2.
3.
private var dbHelper = CustomSQLiteOpenHelper(this)
private val db = dbHelper.writableDatabase
private val empCrud = EmpCrud(db)


Соответственно, в EmpActivity.onStop() пишем:

Код: java
1.
db.close()


Вариант номер 2:

Каждый ХххCrud класс наследуется от CustomSQLiteOpenHelper, например:

Код: java
1.
2.
3.
class EmpCrud(context: Context) : CustomSQLiteOpenHelper(context) {
   ...
}


Тогда наследники будут просто иметь экземпляр SQLiteDatabase внутри себя:

Код: java
1.
2.
3.
4.
5.
6.
7.
val newAutoincrementedId = this.writableDatabase.insert(DbTable.EMP, null, cv)
...
val rowsAffected = this.writableDatabase.update(DbTable.EMP, cv, whereClause, null)
...
val rowsAffected = this.writableDatabase.delete(DbTable.EMP, whereClause, null)
...
val cursor = this.readableDatabase.rawQuery(sql, null)


Как известно, эти пропертиз - вызовы функций getWritableDatabase и getReadableDatabase, которые при первом к ним обращении создают соединение и размещают его в кеше, а затем возвращают его при последующих вызовах. Соединение должно быть закрыто в конце работы аппликации, для чего добавляем в функцию CustomSQLiteOpenHelper.close():

Код: java
1.
2.
val db = this.writableDatabase
if (db.isOpen) db.close()


Затем в каждом Activity создаём экземпляр соответствующего ХххCrud класса. Например, в EmpActivity объявляем:

Код: java
1.
private val empCrud = EmpCrud(context = this)


Недостатком варианта номер 2 видится то, что ХххCrud классы будут тяжеловесней (т.к. уинхерят все поля предка). Но зато меньше писанины (тем более что эта писанина - голимый code duplication).

99% сайтов (и 100% прочитанных мною книг) предлагают не его, а пихать всё в одну кучу внутри CustomSQLiteOpenHelper, а ХххCrud классы вообще не создавать (намного реже - метод номер 1, а метод 2 вообще можно искать со свечкой). В своей "тренировочной" аппликации я использую метод 2, но как-то странно, что "нас так мало" - возможно, я чего-то не вижу. Хотелось бы услышать мнение зубров. Лишь добавлю, что я только начал имплеметировать, и аппликацию пока не запускал, так что все приведённые примеры кода ещё не проверялись (наверняка что-то не учёл, но для иллюстрации вопроса сойдёт).
...
Рейтинг: 0 / 0
Вопрос матёрого новичка про доступ к БД из разных объектов
    #39902987
pand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ursego,

Посмотрите на
ROOM

так гораздо удобнее работать с базой
...
Рейтинг: 0 / 0
Вопрос матёрого новичка про доступ к БД из разных объектов
    #39903062
Фотография Ursego
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pand, Спасибо! Напоминает MyBatis, с которым мне приходилось иметь дело. В чём именно его удобство? И в чём неудобство (или потенциальные проблемы) прямого вызова функций класса SQLiteOpenHelper? Это практический вопрос, а не спор, если чё.
...
Рейтинг: 0 / 0
Вопрос матёрого новичка про доступ к БД из разных объектов
    #39903243
pand
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ursego,

room это orm которая избавляет от рутины парсить резалт сеты и параметры.
можно использовать в связке с RxAndroid. насколько я помню можно получить доступ к контексту базы и работать как с dbHelper.writableDatabase если есть необходимость или желание .

из минусов рума - использование рефлексии ( минус на любителя ) .
...
Рейтинг: 0 / 0
Вопрос матёрого новичка про доступ к БД из разных объектов
    #39903244
Фотография Ursego
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pand, thanx!
...
Рейтинг: 0 / 0
Вопрос матёрого новичка про доступ к БД из разных объектов
    #39904775
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ursego,
А чего Вы просто не используете паттерн Singelton.
У меня Sqlhelper как у Вас...Но дальше я базу раздаю singeltonОМ
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
 static SQLiteDatabase database;
public static SQLiteDatabase getDatabase() {
        if(database==null) {
/Путь к базе из SharedPreferences/
            DB_PATH=MainActivity.getShp().getString("base", "/sdcard/inventar.db");
            database=openDataBase(DB_PATH);}
        return database;
    }
...
Рейтинг: 0 / 0
Вопрос матёрого новичка про доступ к БД из разных объектов
    #39904781
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Вопрос матёрого новичка про доступ к БД из разных объектов
    #39905211
Фотография Ursego
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
irbis_al, это решение всё равно бы поощряло дублирование кода - копипейст цвёл бы и пах. Я решил сделать иначе - запихал повторяющийся код в generic functions, а конкретные model-классы поставляют ему "уникальную" для них информацию, переопределяя функции extractContentValues() и populateFromCursor() интерфейса Crudable, которые все model-классы обязаны имплементировать. Это ещё не окончательный вариант, а скорее первичный набросок, который её допиливать и допиливать - можете глянуть здесь . Буду рад если опытные коллеги подправят или подкинут идей. Если довести до ума, то можно таскать за собой из проекта в проект.
...
Рейтинг: 0 / 0
Вопрос матёрого новичка про доступ к БД из разных объектов
    #39905296
irbis_al
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ursego
irbis_al, это решение всё равно бы поощряло дублирование кода - копипейст цвёл бы и пах. Я решил сделать иначе - запихал повторяющийся код в generic functions, а конкретные model-классы поставляют ему "уникальную" для них информацию, переопределяя функции extractContentValues() и populateFromCursor() интерфейса Crudable, которые все model-классы обязаны имплементировать. Это ещё не окончательный вариант, а скорее первичный набросок, который её допиливать и допиливать - можете глянуть здесь . Буду рад если опытные коллеги подправят или подкинут идей. Если довести до ума, то можно таскать за собой из проекта в проект.


Вот вообще нет ни разу дублирование кода...
Е
Код: plsql
1.
2.
3.
сли Вы это называете дублированием кода 
Sqllitedatabase database ="Modulename".getDatabase();
То тогда можно и import android.Activity назвать дублирование кода.


С концепцией по ссылке я не согласен.(Это тоже не истина в последней инстанции,просто какой-то разработчик решил ,что так будет лучше для всех)
Когда Я писал на java ..я делал класс который рисует ListView и от него наследовался.
Сейчас я пишу на Flutter и сделать это намного на нём проще и изящнее.
Вот тут
https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1319817&msg=22032806
Обсуждалось можно посмотреть видео Flutter и код.
...
Рейтинг: 0 / 0
Вопрос матёрого новичка про доступ к БД из разных объектов
    #39905878
Фотография Ursego
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
irbis_al
Вот вообще нет ни разу дублирование кода...
Ну как же не дублирование? Посмотрите на CRUD-функции класса BaseCrud (по ссылке, что я дал). Не будь этих generic функций, их код копировался бы десятки (если не сотни) раз - заменялись бы только фрагменты, которые заполняют ContentValues и извлекают данные из курсора.

irbis_al
С концепцией по ссылке я не согласен.
Так не только Вы! Авторы всех книг и статей по Андроиду тоже не согласны с концепцией предотвращения дублирования кода, и копипейстят так, что дым из ушей!
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Android [игнор отключен] [закрыт для гостей] / Вопрос матёрого новичка про доступ к БД из разных объектов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]