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

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

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

Сообщение Mikhail_dev » 24 янв 2014, 12:23

Собственно я давно уже особо не вникал в данную тему и реализовывал БД в простом варианте(пару таблиц, пару связей). На данный момент интересует ПРАВИЛЬНЫЙ подход к управлению SQLite. Хотя может быть и не SQLite, но вдруг именно для SQLite есть что-то интересное. пара вопросов:
1. Используете ли вы ORM подход для работы с данными?
2. Как лучше читать/писать данные в базу? (правильная архитектура). Синглтон какой-нибудь для обработки, либо какие-то CursorLoaders, либо еще что-то.
3. Место хранения базы. Если база небольшая, в основном текстовые данные, то где вы стараетесь её хранить? Используете ли какую-нибудь синхронизацию, если приложение клиент-серверное? Может у гугла есть какое-то API, которое позволяет делать синхронизацию с его серверами?
4. Интересуют актуальные статьи по этому поводу, желательно свежие, а также желательно на английском языке. Видео на английском к сожалению пока не могу воспринимать, уровень не тот.

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

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

Сообщение rezak90 » 24 янв 2014, 12:27

Спроси тётю Инну, или вы по этому поводу и ссорились?
1. Да, если не ошибаюсь то сейчас это ActiveDroid;
2. В оф туториале и книгах пишут что контент провайдер;
3. Я читал книгу Android PRO, там прекрасно всё написано;
R.id.team
Политика на форуме запрещена

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

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

Сообщение Mikhail_dev » 24 янв 2014, 12:33

Спроси тётю Инну, или вы по этому поводу и ссорились?
Это они с Денисом.
P.S. Слава, я добавил еще один маленький вопрос =)

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

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

Сообщение anber » 24 янв 2014, 12:40

Сейчас придет Foenix и расскажет как правильно ;)

UPD. опоздал :D

UPD2. Собственно я так понимаю интересует только база данных которая создается приложением с нуля, или вычитывание из существующей тоже актуально? Так же интересует ли вопрос менеджмента закачиваемых баз данных (например в моем случае человек выбирает какой нибудь город, скажем Москва, по нему выкачивается база, потом он хочет переключиться на Киев, выкачивается его база итд)?
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

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

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

Сообщение rezak90 » 24 янв 2014, 12:53

m090050 писал(а):
P.S. Слава, я добавил еще один маленький вопрос =)
прочитал, по БД я вообще почти профан, и на этот вопрос у меня ответа нету :(
R.id.team
Политика на форуме запрещена

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

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

Сообщение KamiSempai » 24 янв 2014, 13:07

m090050 писал(а):
Спроси тётю Инну, или вы по этому поводу и ссорились?
Это они с Денисом.
Мы с ней не ссоримся - это у нас такой рабочий процесс)
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

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

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

Сообщение rezak90 » 24 янв 2014, 13:15

KamiSempai писал(а):
m090050 писал(а):
Спроси тётю Инну, или вы по этому поводу и ссорились?
Это они с Денисом.
Мы с ней не ссоримся - это у нас такой рабочий процесс)
она же теперь боится в скайп заходить, и как только начинаешь у неё спрашивать "А что у вас там с проектом" у неё сразу слёзы на глазах наворачиваются... жалко смотреть :(
R.id.team
Политика на форуме запрещена

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

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

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

:-D
ну все все про меня знают, особо Слава
R.id.team

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

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

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

Сообщение Mikhail_dev » 24 янв 2014, 14:14

или вычитывание из существующей тоже актуально?
Да, уже есть люди кто пользуется старой версией. Скорее всего придется выкачивать данные со старой и заносить их в новую.
Так же интересует ли вопрос менеджмента закачиваемых баз данных (например в моем случае человек выбирает какой нибудь город, скажем Москва, по нему выкачивается база, потом он хочет переключиться на Киев, выкачивается его база итд)?
это я так думаю уже зависит от того, как построится архитектура. У нас геолокационный сервис, в котором по идее не будет много сущностей в базе, но такие вещи как закладки, история поиска, оффлайн режим трека (т.е. запись трека в базу) будут в базе. Т.е. было бы неплохо показать какие-то данные по старому запросу, если нет интернета к примеру, а не просто говорить об его отсутствии. Но это детали. Т.е. другими словами слишком частого общения с базой не предвидится. Сохранение трека идет по алгоритму такому: отправляется местоположение на сервер. Если вдруг интернет обваливается, то точки попадают в коллекцию-очередь. Если накопилось более 20 неотправленных, то в базу сбрасывается 10 из них. Другими словами, мы не дергаем постоянно базу даже при записи трека.

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

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

Сообщение Foenix » 24 янв 2014, 16:23

Миша, чем тебя существующий подход не устраивает, коли все это есть?
R.id.team

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

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

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

Сообщение Mikhail_dev » 24 янв 2014, 17:25

Я не знаю какой сейчас существующий подход. Да и это не единственный вопрос.

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

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

Сообщение Foenix » 24 янв 2014, 17:38

я имею ввиду у вас в программе
R.id.team

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

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

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

Сообщение Mikhail_dev » 24 янв 2014, 19:36

У нас две базы, которые надо правильно слить в одну, но первая использует ORM подход, поэтому она не может работать с флешкой (работа с базой данных на версии Api7 несколько другая и требует шаманства, а с ORM вообще сходит на нет). Вторая на флешке, кеширует. В общем это разброс и требует полной переделки. К тому же синхронизация с сервером не за горами. Так что надо будет сделать с блекджеком и составляющими.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

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

Сообщение Mikhail_dev » 25 янв 2014, 10:10

Так много топиков с базами данных и что, никто никогда не думал о том, как лучше с ней работать?

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

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

Сообщение Foenix » 25 янв 2014, 13:51

я думала.
R.id.team

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

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

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

Сообщение anber » 25 янв 2014, 22:54

m090050 писал(а):Так много топиков с базами данных и что, никто никогда не думал о том, как лучше с ней работать?
Покажу как работал с базой в последнем своем проекте, тут простой пример - https://github.com/akadatsky/UserDatabaseExample
Основные идеи:
- главная логика в файле UserDatabase
- база хранится в системой папке приложений: /data/data/packagename/databases/user.db
- стандартный метод onUpgrade, в случае если в существующую таблицу нужно добавить столбец или скопировать таблицу в это делается тут
- пример использования:

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

  private List<User> users;
  private UserDatabase userDatabase;
  userDatabase = UserDatabase.get(context);

  userDatabase.addUser(new User("someName", "someSecondName"));
  users = userDatabase.getAllUsers();
  userDatabase.removeAllUsers();
- пример метода getAllUsers():

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

  
  private static final String USER_TABLE = "user";
  private static final CursorMapper<User> userMapper = CursorMapper.create(User.class);
public List<User> getAllUsers() {
    Cursor cursor = getReadableDatabase().rawQuery("SELECT * FROM " + USER_TABLE, null);
    return userMapper.map(cursor);
  }
- каждая запись получает уникальный строковый id типа "s0wXCKAEgoCnlYyNiuLCmw", который удобно использовать при синхронизации с сервером.

- используется кастомный mapper, который из курсора может получить список model, при этом типичная model выглядит так:

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

public class User {

  @Column("_id")
  private String id;
  @Column("name")
  private String name;
  @Column("second_name")
  private String secondName;
  @Column("created_at")
  private Date createdAt;

  public User() {
  }

  public User(String name, String secondName) {
    this.name = name;
    this.secondName = secondName;
  }
  
  // getters and setters
}
- синхронизация с сервером это отдельный вопрос, если интересует расскажу подробнее
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

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

Сообщение Mikhail_dev » 26 янв 2014, 08:54

В принципе понял, спасибо. Кстати, была ли необходимость работать с базой с двух процессов?

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

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

Сообщение anber » 26 янв 2014, 12:11

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

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

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

Сообщение altwin » 26 янв 2014, 12:19

m090050 писал(а):Собственно я давно уже особо не вникал в данную тему и реализовывал БД в простом варианте(пару таблиц, пару связей). На данный момент интересует ПРАВИЛЬНЫЙ подход к управлению SQLite. Хотя может быть и не SQLite, но вдруг именно для SQLite есть что-то интересное. пара вопросов:
1. Используете ли вы ORM подход для работы с данными?
2. Как лучше читать/писать данные в базу? (правильная архитектура). Синглтон какой-нибудь для обработки, либо какие-то CursorLoaders, либо еще что-то.
3. Место хранения базы. Если база небольшая, в основном текстовые данные, то где вы стараетесь её хранить? Используете ли какую-нибудь синхронизацию, если приложение клиент-серверное? Может у гугла есть какое-то API, которое позволяет делать синхронизацию с его серверами?
4. Интересуют актуальные статьи по этому поводу, желательно свежие, а также желательно на английском языке. Видео на английском к сожалению пока не могу воспринимать, уровень не тот.
У меня не так много опыта в Android, потому отвечу спецефично для того, с чем сталкивался.
1. Да - всегда, но пишу его всегда сам реализуя только необходимый функционал. Напрямую к базе не обращаюсь никогда, только через объект.
2. В основном базу на устройстве лично я использую для заполнения List/Grid view, после загрузки контента, потому мне хватает стандартных Cursor. При более менее сложной логике работы с базой - только rest. Т.е. я вообще ничего не храню на устройстве, вся логика работы на сервере, Android клиент только передает параметры для формирования insert/select. Но опять же в том случае, если я что то делаю с базой непосредственно в Android - по максимуму использую SQL. Ну а ограничения в досутпности сети у меня пока не возникало в задачах.
P.S. как бы да, делая запрос к примеру к vk.com, это делаю с сервера, далее в Android мне проще.
3. Как и сказал уже я по максимуму исопльзую cloud, на устройстве база в основном динамическая. По поводу API, я использую App Engine или Heroku для серверного кода. Синхронизация, есть google drive и подобное, зависит от клиента, хотя для настоящей синхронизации задачи у меня не было, поскольку, как и говорил базы не устройстве нет.
4. Ничего не читал :( Работал с mysql и postgre в django/flask/Yii/symfony, все, что вынес из этого - на сервере использую postgre и никакой возможности оптимизировать sqlite не вижу, потому потребности в изучении чего то спецефичного для нее не было.

P.S> забыл ссылку :) по сути не вижу смысла читать больше, чем есть тут: http://www.androiddesignpatterns.com/20 ... abase.html
Изображение

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

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

Сообщение Mikhail_dev » 26 янв 2014, 13:12

имеется в виду в разных приложения, которые работают с одной базой?
в одном
1. Да - всегда, но пишу его всегда сам реализуя только необходимый функционал. Напрямую к базе не обращаюсь никогда, только через объект.
А пишешь через интерфейс к существующему API андроида или на более низком уровне? ORM же получается медленней работает, нежели с курсором. Или спасает то, что в основном работа с базой идет на серверной стороне?
Как и сказал уже я по максимуму исопльзую cloud, на устройстве база в основном динамическая.
Динамическая это когда в ОЗУ данные загружаются с базы?

Ответить