Правильная работа с базой

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
maxim
Сообщения: 9
Зарегистрирован: 25 июн 2012, 09:31

Правильная работа с базой

Сообщение maxim » 28 июл 2012, 13:35

Хотелось бы узнать как работать с базой. Создаю/подключаю её в MainActivity

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

...
public class MainActivity extends Activity implements OnClickListener {
...
    public SQLiteDatabase db;
...
    public void onCreate(Bundle savedInstanceState) {
...
	SQLiteDatabase db = dbHelper.getWritableDatabase();
	//new InitDB().execute(); // создаем не в основном потоке
...
    }
Вопрос в том что как правильно работать с базой db в других активити. Передавать параметром при создании либо ссылаться на MainActivity.db, а может еще как-нибудь... И так и так работает просто хз как правильно.

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

Re: Правильная работа с базой

Сообщение rezak90 » 28 июл 2012, 13:59

никуда ничего передавать не надо и ссылаться тоже, создавай в другой активити объект своего класса dbHelper и работай с базой. База то одна, просто в каждой активити подключаешься к ней и твори что хочешь.
R.id.team
Политика на форуме запрещена

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: Правильная работа с базой

Сообщение Finch » 28 июл 2012, 14:14

Я 6ы свой Helper класс написал, но это совсем другая история =)
CEO of a company R.id.team

maxim
Сообщения: 9
Зарегистрирован: 25 июн 2012, 09:31

Re: Правильная работа с базой

Сообщение maxim » 30 июл 2012, 12:56

rezak90 писал(а):никуда ничего передавать не надо и ссылаться тоже, создавай в другой активити объект своего класса dbHelper и работай с базой. База то одна, просто в каждой активити подключаешься к ней и твори что хочешь.
Интересно как это повлияет на производительность. Ведь на подключение к SQLite базе уходит какое-то время пусть и не секунда, согласно логам время подключения 020мс, но и размер базы сейчас не велик около 150кб. Просто для windows приложений с подключенной базой MSSQL этого делать было нельзя для этого был компонент ADOConnection который раздавал коннекшэн всем query.
Finch писал(а):Я 6ы свой Helper класс написал, но это совсем другая история =)
Helper класс свой там-же написал синхронизацию с внешним сервером.

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

Re: Правильная работа с базой

Сообщение rezak90 » 30 июл 2012, 13:14

ну если для тебя будет критично каждый раз переподключаться то тогда при создании главного окна один раз подключись к бд и далее реши то ли ты будешь передавать в другие активити созданный объект или же ты обявишь его как статик и будешь обращаться к нему с любого места.
R.id.team
Политика на форуме запрещена

Аватара пользователя
powercat
Сообщения: 508
Зарегистрирован: 20 июл 2012, 11:31

Re: Правильная работа с базой

Сообщение powercat » 14 авг 2012, 16:06

rezak90 писал(а):никуда ничего передавать не надо и ссылаться тоже, создавай в другой активити объект своего класса dbHelper и работай с базой. База то одна, просто в каждой активити подключаешься к ней и твори что хочешь.
А можно пример вот этого создания?

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

Re: Правильная работа с базой

Сообщение rezak90 » 14 авг 2012, 17:05

вот эту объявленную переменную:
public SQLiteDatabase db;
передаёшь в следующее активити и там уже обращаешся к бд, или сделай её статик и обращайся к любой активити
R.id.team
Политика на форуме запрещена

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

Re: Правильная работа с базой

Сообщение neoksi » 16 авг 2012, 11:30

Правильная работа с БД в Андроиде строится через ContentProvider, писать его цепочку мучительно, но когда реализуешь, все становится очень просто.
Схема работы получается следующая: Активити (или сервис) <-> Контент провайдер <-> BDHelper <-> БД.
Основной плюс контент провайдера в том, что в результате, ты можешь работать с БД из многих источников (активити и сервисов) не боясь, что один из процессов, другому заблокирует доступ к данным.

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

Re: Правильная работа с базой

Сообщение rezak90 » 16 авг 2012, 11:39

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

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

Re: Правильная работа с базой

Сообщение neoksi » 16 авг 2012, 11:44

Согласен, особенно если она работает только с приложением, без синхронизации с интернетом.

Volha
Сообщения: 61
Зарегистрирован: 20 авг 2012, 17:39

Re: Правильная работа с базой

Сообщение Volha » 20 авг 2012, 17:56

Все-таки не совсем поняла как правильно работать с базой данных, объясните поподробнее, пожалуйста.

У меня есть вспомогательный класс для работы с БД(Samo_DB) стандартного вида, который приводится во всех уроках.
Есть мой собственный класс Connect(отличный от mainactivity). В нем я в какой-то момент открываю для записи БД.

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

Samo_DB samo_db = (new Samo_DB(null)).getWritableDatabase();
Но вываливаюсь в NullPointerException. На просторах интернета был найден вариант, что мой класс еще не готов к работе и проблему следует решать добавлением части кода в onCreate:

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

public class Samo_Connect {
 public Samo_Connect(){
  samo_db = new Samo_DB(null);
 }
	
 public void onCreate(){
  db = samo_db.getWritableDatabase();
 }
}
Но я опять вываливаюсь при попытке getWritableDatabase с той же ошибкой, кто-нибудь знает решение проблемы?

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Правильная работа с базой

Сообщение AndreyI » 20 авг 2012, 18:16

Для открытия базы нужен прежде всего Сontext или его наследник (тот же Activity, к примеру), именно его методами база, собственно и открывается, поскольку именно у контекста есть доступ к ресурсам приложения и файловой системе, если я правильно понял, вы в качестве контекста передаете null, поэтому и получаете NullPointerException. Хотя, может вы как-то по другому передаете контекст в вспомогательный класс, но по столь скудной информации это понять невозможно.

Volha
Сообщения: 61
Зарегистрирован: 20 авг 2012, 17:39

Re: Правильная работа с базой

Сообщение Volha » 21 авг 2012, 10:09

Спасибо большое, мне помогло)
А не расскажете поподробнее об этой теме? Сейчас я получаю контекст из активити как getBaseContext и передаю в свой класс.
А как правильно самой создавать контекст? Или только(проще) передать?

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Правильная работа с базой

Сообщение KamiSempai » 21 авг 2012, 10:20

Volha писал(а):Спасибо большое, мне помогло)
А не расскажете поподробнее об этой теме? Сейчас я получаю контекст из активити как getBaseContext и передаю в свой класс.
А как правильно самой создавать контекст? Или только(проще) передать?
Использовать getBaseContext в Activity - это лишнее. Activity сама является контекстом и можно передавать ее, без каких либо изменений.
Так как у нас всегда под рукой есть готовый контекст(Activity), проще его передать, чем создавать новый.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Правильная работа с базой

Сообщение AndreyI » 21 авг 2012, 10:53

Volha писал(а):Спасибо большое, мне помогло)
А не расскажете поподробнее об этой теме? Сейчас я получаю контекст из активити как getBaseContext и передаю в свой класс.
А как правильно самой создавать контекст? Или только(проще) передать?
Такие объекты как Activity создаются системой, самостоятельно врядли что получится т.к. многие реализации контекста скрыты от пользователей и программистов на Андроид, это сделано, по всей видимости, из соображений защиты, совместимости приложений и их взаимодействия с системными ресурсами. К примеру, Activity наследуется от ContextWrapper, который в свою очередь от класса Context, если посмотреть исходники того же класса Context, то мы увидим что он практически полностью состоит из абстрактных методов, далее смотрим обертку ContextWrapper в которой должны реализовываться абстрактные методы, что на первый взгляд действительно так, но вся реализация их сводится к вызовам методов суперкласса т.е. Context, в котором они не реализуются, в общем круг замкнулся :)
Если провести трассировку, то выяснится, что на самом деле реализация методов класса Context производится в классе ContextImpl но механизм подмены мне не совсем ясен, еще так глубоко не копал :) .

XCORP
Сообщения: 2
Зарегистрирован: 14 ноя 2012, 00:29

Re: Правильная работа с базой

Сообщение XCORP » 16 ноя 2012, 22:30

Кто может правильно направить в следующем вопросе? Допустим есть много Activity и вспомогательных (отдельно лежащих) классов. Как наилучшим образом поступить, чтобы была возможность обмена абсолютно разными (простыми, перекрестными, маленькими, большими) запросами с базой данных из различных уголков программы (с учетом того, чтобы это изначально не повлекло к снижению производительности и безопастности)? Так вот, что можно наилучшим образом сделать: составить собственный класс (адаптер) для работы c SQLOpenHelper или того хуже SQLDatabase; или же выбрать CursorAdapter, но на сколько я понял он нужен и собственно проектировался для обмена данными между приложениями. В моем же случае база так-сказать с аутентификацией и максимум что из общего доступа будет использоваться это синхроризация с внешней базой данных и облака с локальной базой данных, но мне кажется это можно сделать и с использованием адаптера (в теории). А и собственно база данных уже вобрала в себя 8 таблиц. С учетом всего изложенного, что выбрать? У меня есть пока что, только наброски и адаптера, и провайдера, но я не знаю что использовать, поэтому и спрашиваю.
Последний раз редактировалось XCORP 16 ноя 2012, 23:27, всего редактировалось 1 раз.

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

Re: Правильная работа с базой

Сообщение rezak90 » 16 ноя 2012, 23:18

Немного не корректные вопросы. Всё зависит от того где нужно отображать данные (листы или простые поля в активити), какое количество данных, что за данные (может у вас картинки и это повлияет на производительность).

Почему то многие задумываются о производительности при работе с бд, в большинство случаев это пару сотен запись, и они на производительность не решают. У меня например 1000 записей, они выбираются с бд, потом в листах перебираются и это всё занимает около 1 сек.
R.id.team
Политика на форуме запрещена

XCORP
Сообщения: 2
Зарегистрирован: 14 ноя 2012, 00:29

Re: Правильная работа с базой

Сообщение XCORP » 16 ноя 2012, 23:36

rezak90 писал(а):Всё зависит от того где нужно отображать данные (листы или простые поля в активити), какое количество данных, что за данные (может у вас картинки и это повлияет на производительность).
Что касается "где?", то это: простые и составные списки; поля в activity. На счет, картинок, то им не место базе данных. Дело в том что нужен свободный доступ к базе данных из любого места с учетом всего, что было в предыдущем посте. С одной стороны он вполне удобен, но нужен ли он? Я только начинаю разбираться с Android SDK как собственно и с Java и просто не хочу с самого начала забраться в дебри.

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

Re: Правильная работа с базой

Сообщение rezak90 » 17 ноя 2012, 00:49

опять вопрос, наверное последний: доступ к бд, имеется в виду несколько приложений имеют доступ к бд?
простые и составные списки; поля в activity
если уж такое желанию, то например:
1) SimpleCursorAdapter, только универсальный, в который передавать лейауты, к бд он будет обращаться, а вот строить листы исходя из входного лейаута;
2) написать контентпровайдер, который будет запущен один раз, и который можно дёргать из любой активити, получать курсор и кормить его адаптерам.

З.Ы. например у меня в приложении для бд написаны пару классов, и конечный один, который я дёргаю с любого места и могу получить любые данные, так удобней.
R.id.team
Политика на форуме запрещена

Ant
Сообщения: 9
Зарегистрирован: 05 дек 2012, 14:06

Re: Правильная работа с базой

Сообщение Ant » 14 фев 2013, 08:17

а вот такой ещё вопрос.
допустим, есть приложение с несколькими экранами (активити).
допустим, я решил не стрелять из пушки по воробьям и не использовать контентпровайдер. в каждой активити будет своё подключение к БД.

но! хорошо бы всё-таки в любой момент времени знать, что например, сейчас идет работа с БД в фоновой активити и надо подождать секунду-другую. то есть, какой-то глобальный флаг, что ли.

или можно стартовать сервис, работающий с БД, а запросы ставить ему в очередь, и на выходе получать указатель на массивы (или списки, или как там это всё именуется в андроиде) данных в буфере вывода сервиса.

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

Ответить