SlideShare a Scribd company logo
1 of 30
Download to read offline
Database
Android
Дмитрий Колесников
SQLite
встраиваемая реляционная база данных
открытый исходный код.
нет отдельного сервера
высокая скорость
небольшой расход памяти
поддержка стандартных возможностей реляционных БД – синтаксис SQL, транзакции и
prepared statements
вся база данных в одном файле
кроссплатформенная
http://sqlite.org
SQLite в Android
доступно на любом устройстве Android
не требует установки БД или администрирования
вся работа с базой данных должна быть в отдельном потоке
файл БД хранится в каталоге приложения
SQLite в Android
Contract class
SQL Helper
SQLiteDatabase
Cursor
CursorAdapter
CursorLoader
Contract class
Хранит константы, определяющие имена для ваших URI, таблиц, колонок.
Best practice:
создаем класс, который будет хранить константы для всей базы данных
создаем внутренние классы с константами для каждой таблицы
реализуем интерфейс BaseColumns
SQLiteOpenHelper
Абстрактный класс, с помощью которого можно создавать, открывать и обновлять базу
данных
Создаем наследника и переопределяем следующие методы:
onCreate() - вызывается при первом создании базы данных
onUpgrade() - вызывается при модификации базы данных
Должен быть singleton
Поле id в таблице должно именоваться _id (На самом деле, нет)
close() - закрыть базу.
getReadableDatabase()/getWritableDatabase() - создают и/или открывают БД. Возвращают
объект SQLiteDatabase
SQLiteDatabase
Работает с базой данных SQLite напрямую, содержит методы:
insert()
update()- Используют ContentValues
delete()
query() - делает запрос к таблице и возвращает Cursor
rawQuery() - исполняет sql запрос и возвращает Cursor
execSQL() - выполнение одного sql запроса. (NOT a SELECT/INSERT/UPDATE/DELETE)
Cursor
Возвращается на запрос к базе данных, и предоставляет доступ к результатам запроса.
Содержит методы:
moveToFirst()
moveToNext()
типизированные методы getInt(); getLong();getString(); etc
getColumnIndex()
close()
CursorAdapter
Адаптер, который отображает данные из курсора на ListView
Курсор должен включать столбец с названием "_id" или этот класс не будет работать
CursorLoader
Позволяет выполнять запросы в отдельном потоке
Наследник AsyncTaskLoader’а
Loaders API
Content Provider
Класс для обмена данными между приложениями.
1 <provider
2 android:authorities="com.noveo.internship.db.exampleContentProvider"
3 android:name=".database.ExampleContentProvider"
4 android:multiprocess="true"
5 android:exported="false" />
Content Provider
Создаем наследника и переопределяем методы:
onCreate()
query()
getType()
insert()
update()
delete()
Content Provider
При работе с провайдером используются URI.
1 content://<authority>/<path>/<id>
authority - уникальное имя ContentProvider-а
path - какие данные нужны (имя таблицы)
id - идентификатор записи.
content://com.noveo.db.provider/toys/5
content://com.noveo.db.provider/toys
UriMatcher
служит для определения деталей запроса к контент- провайдеру
отображает URI разных видов на целочисленные константы
полезен в случаях, когда обслуживаются разные URI для доступа к одному и тому же
источнику данных
Пример:
Если URI оканчивается на /toys - это запрос про все игрушки
Если на toys/[ID] - про конкретную игрушку
Жизнь одного запроса
1. вызываем getContentResolver().query(Uri, String, String, String, String)
2. СontentResolver анализирует Uri и извлекает от туда authority
3. ContentResolver направляет запрос к ContentProvider-у зарегестрированному по этому
authority (уникальному)
4. ContentProvider выполняет запрос и возвращает Cursor (или исключение)
Sql to No-Sql
Когда нет желания создавать под каждую сущность отдельную таблицу.
Делаем универсальную таблицу с:
id
object_name
object_version
object_data
Сравниваем object_version класса object_name с object_version в БД.
Достаем object_data и парсимкастуем к object_name типу.
ORM
(object-relational mapping)
технология, связывающая таблицы в базе данных с объектами в приложени
для решения данной задачи в Android можно использовать ORMLite
ORMLite
открытый исходный код
поддержка SQLite
простые аннотации, быстрый старт
при этом все гибко настраивается, нужно только залезть в документацию
http://ormlite.com/
http://habrahabr.ru/post/143431/
ORMLite. Модели
1 @DatabaseTable(tableName = "accounts")
2 public class Account {
3
4 public static final String NAME_FIELD_NAME = "name";
5 public static final String PASSWORD_FIELD_NAME = "passwd";
6
7 @DatabaseField(generatedId = true)
8 private int id;
9 @DatabaseField(columnName = NAME_FIELD_NAME, canBeNull = false)
10 private String name;
11 @DatabaseField(columnName = PASSWORD_FIELD_NAME)
12 private String password;
13 @ForeignCollectionField
14 private ForeignCollection<Order> orders;
15
16 Account() {
17 // Пустой конструктор обязательно должен быть(если есть непустые)
18 }
19 // Другие конструкторы
20 // Геттеры, сеттеры и проч.
21 }
ORMLite. DAO (Data Access Object)
Для каждого класса модели создается DAO (Класс наследник от BaseDaoImpl)
1 public class AccountDAO extends BaseDaoImpl<Account, Integer>{
2
3 protected AccountDAO(ConnectionSource connectionSource,
4 Class<Account> dataClass) throws SQLException{
5 super(connectionSource, dataClass);
6 }
7
8 public List<Account> getAllAccounts() throws SQLException{
9 return this.queryForAll();
10 }
11 }
ORMLite. DatabaseHelper
Наследуется от OrmLiteSqliteOpenHelper
Реализует методы: onCreate(), onUpgrade()
Создает DAO для классов, содержит методы для получения этих DAO
Должен быть синглтоном
ORMLite. Работа с данными
1 AccountDAO accountDao = DatabaseHelper.getHelper().getAccountDao();
2 List<Account> accounts = accountDao.getAllAccounts();
3 for (Account account : accounts) {
4 account.setPassword("new_password");
5 accountDao.update(account);
6 }
Realm
Использует собственное хранилище объектов, а не SQLite
Разрабатывалась специально под мобильные платформы
Не работает на Java вне Android'а
В операциях чтения показывает производительность выше, чем raw SQLite (в операциях
записи ниже)
Realm. Модели
Модели должны наследоваться от RealmObject
1 public class Person extends RealmObject {
2
3 // По-умолчанию все поля сохраняются в хранилище
4 private String name;
5 private int age;
6
7 // ... Геттеры-сеттеры и т.д.
8 }
Realm. Транзакции
1 RealmConfiguration realmCfg = new RealmConfiguration.Builder(context).build();
2 Realm realm = Realm.getInstance(realmCfg);
3
4 final Person person = realm.where(Person.class).findFirst();
5
6 realm.executeTransaction(new Realm.Transaction() {
7 @Override
8 public void execute(Realm realm) {
9 person.setName("Senior Person");
10 person.setAge(99);
11 }
12 });
Realm. Асинхронное выполнение операций
1 RealAsyncTask transaction = realm.executeTransactionAsync(new Realm.Transaction() {
2 @Override
3 public void execute(Realm bgRealm) {
4 //do something
5 }
6 }, new Realm.Transaction.OnSuccess() {
7 @Override
8 public void onSuccess() {
9 // Transaction was a success.
10 }
11 }, new Realm.Transaction.OnError() {
12 @Override
13 public void onError(Throwable error) {
14 // Transaction failed and was automatically canceled.
15 }
16 });
Realm. Асинхронное выполнение операций
Асинхронные транзакции нужно отменять, если они больше не нужны.
1 public void onStop () {
2 if (transaction != null && !transaction.isCancelled()) {
3 transaction.cancel();
4 }
5 }
Realm. Ограничения и недостатки
Вложенные транзакции не поддерживаются
Имя модели должно быть не больше 57 символов, имя поля - 63 символов
String и byte[] должны быть не больше 16Мб
RealmObject’ы не могут быть ключом в HashMap и храниться в HashSet
Есть некоторые проблемы с сортировкой и поиском по non-Latin строкам
Debug
1. Через adb shell.
cd /data/data/
cd com.noveo.internship.db
cd databases
находим файл нашей БД, test.db, например, и цепляемся туда.
sqlite3 test.db
Нужен рут. Что делать без рута?
Debug
Сторонние решения. Например Stetho от FB.
Позволяет многие вещи, в том числе и инспекцию БД.
SQLite databases can be visualized and interactively explored with full read/write
capabilities.
Stetho

More Related Content

What's hot

Drupal 7 и history.js или как ajax инфицировать сайт
Drupal 7 и history.js или как ajax инфицировать сайтDrupal 7 и history.js или как ajax инфицировать сайт
Drupal 7 и history.js или как ajax инфицировать сайт
DrupalCamp Kyiv Рысь
 
Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»
e-Legion
 
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGвебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
Andrey Rebrov
 
Полное руководство по аудиту доменных служб Active Directory в Windows Server...
Полное руководство по аудиту доменных служб Active Directory в Windows Server...Полное руководство по аудиту доменных служб Active Directory в Windows Server...
Полное руководство по аудиту доменных служб Active Directory в Windows Server...
Netwrix Россия/СНГ
 
Java осень 2012 лекция 7
Java осень 2012 лекция 7Java осень 2012 лекция 7
Java осень 2012 лекция 7
Technopark
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
Technopark
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
Python Meetup
 
Web осень 2013 лекция 3
Web осень 2013 лекция 3Web осень 2013 лекция 3
Web осень 2013 лекция 3
Technopark
 
Frontend весна 2014 лекция 3
Frontend весна 2014 лекция 3Frontend весна 2014 лекция 3
Frontend весна 2014 лекция 3
Technopark
 
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Yandex
 

What's hot (19)

Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"
Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"
Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"
 
Drupal 7 и history.js или как ajax инфицировать сайт
Drupal 7 и history.js или как ajax инфицировать сайтDrupal 7 и history.js или как ajax инфицировать сайт
Drupal 7 и history.js или как ajax инфицировать сайт
 
Drupal 7 and History.js
Drupal 7 and History.jsDrupal 7 and History.js
Drupal 7 and History.js
 
Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»
 
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGвебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
 
Восстановление учетных записей Active Directory: сборник сценариев
Восстановление учетных записей Active Directory: сборник сценариевВосстановление учетных записей Active Directory: сборник сценариев
Восстановление учетных записей Active Directory: сборник сценариев
 
Полное руководство по аудиту доменных служб Active Directory в Windows Server...
Полное руководство по аудиту доменных служб Active Directory в Windows Server...Полное руководство по аудиту доменных служб Active Directory в Windows Server...
Полное руководство по аудиту доменных служб Active Directory в Windows Server...
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node js
 
Java осень 2012 лекция 7
Java осень 2012 лекция 7Java осень 2012 лекция 7
Java осень 2012 лекция 7
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
 
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
 
Приложения для Windows Phone: как мы это делаем #codefest
Приложения для Windows Phone: как мы это делаем #codefestПриложения для Windows Phone: как мы это делаем #codefest
Приложения для Windows Phone: как мы это делаем #codefest
 
XP практики в проектах с тяжелой наследственностью
XP практики в проектах с тяжелой наследственностьюXP практики в проектах с тяжелой наследственностью
XP практики в проектах с тяжелой наследственностью
 
Web осень 2013 лекция 3
Web осень 2013 лекция 3Web осень 2013 лекция 3
Web осень 2013 лекция 3
 
Взломать сайт на ASP.NET
Взломать сайт на ASP.NETВзломать сайт на ASP.NET
Взломать сайт на ASP.NET
 
Frontend весна 2014 лекция 3
Frontend весна 2014 лекция 3Frontend весна 2014 лекция 3
Frontend весна 2014 лекция 3
 
[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)
 
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
 

Viewers also liked

DIOR-DNA, Anton Zvonov, Part 1, Activities (жизненный цикл)
DIOR-DNA, Anton Zvonov, Part 1, Activities (жизненный цикл)DIOR-DNA, Anton Zvonov, Part 1, Activities (жизненный цикл)
DIOR-DNA, Anton Zvonov, Part 1, Activities (жизненный цикл)
Антон Звонов
 

Viewers also liked (20)

Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)
 
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
 
Семантика текста (HTML5 тема 04 - семантика текста)
Семантика текста (HTML5 тема 04 - семантика текста)Семантика текста (HTML5 тема 04 - семантика текста)
Семантика текста (HTML5 тема 04 - семантика текста)
 
Webinar: Возможности RAD Studio 10 Seattle для разработки Windows 10 приложений
Webinar: Возможности RAD Studio 10 Seattle для разработки Windows 10 приложенийWebinar: Возможности RAD Studio 10 Seattle для разработки Windows 10 приложений
Webinar: Возможности RAD Studio 10 Seattle для разработки Windows 10 приложений
 
Lec 10
Lec 10Lec 10
Lec 10
 
Lec 12
Lec 12Lec 12
Lec 12
 
Стилизация текста (HTML5 тема 05 - стилизация текста)
Стилизация текста (HTML5 тема 05 - стилизация текста)Стилизация текста (HTML5 тема 05 - стилизация текста)
Стилизация текста (HTML5 тема 05 - стилизация текста)
 
Thread
ThreadThread
Thread
 
Seminar: Установка и настройка рабочего стенда разработчика Android-приложени...
Seminar: Установка и настройка рабочего стенда разработчика Android-приложени...Seminar: Установка и настройка рабочего стенда разработчика Android-приложени...
Seminar: Установка и настройка рабочего стенда разработчика Android-приложени...
 
Webinar: Использование UWP/WinRT Contracts и Notification в Windows 10
Webinar: Использование UWP/WinRT Contracts и Notification в Windows 10Webinar: Использование UWP/WinRT Contracts и Notification в Windows 10
Webinar: Использование UWP/WinRT Contracts и Notification в Windows 10
 
Seminar: Эффективное использование среды разработки и компилятора C++
Seminar: Эффективное использование среды разработки и компилятора C++Seminar: Эффективное использование среды разработки и компилятора C++
Seminar: Эффективное использование среды разработки и компилятора C++
 
Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)
 
Webinar: Разработка мобильного приложения для заучивания стихов в Delphi
Webinar: Разработка мобильного приложения для заучивания стихов в DelphiWebinar: Разработка мобильного приложения для заучивания стихов в Delphi
Webinar: Разработка мобильного приложения для заучивания стихов в Delphi
 
Animations (Lecture 17 – animations)
Animations (Lecture 17 – animations)Animations (Lecture 17 – animations)
Animations (Lecture 17 – animations)
 
Системы автоматизированной сборки (Lecture 05 – gradle)
Системы автоматизированной сборки (Lecture 05 – gradle)Системы автоматизированной сборки (Lecture 05 – gradle)
Системы автоматизированной сборки (Lecture 05 – gradle)
 
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
 
Введение в Android-разработку (Lecture 06 – basics)
Введение в Android-разработку (Lecture 06 – basics)Введение в Android-разработку (Lecture 06 – basics)
Введение в Android-разработку (Lecture 06 – basics)
 
DIOR-DNA, Anton Zvonov, Part 1, Activities (жизненный цикл)
DIOR-DNA, Anton Zvonov, Part 1, Activities (жизненный цикл)DIOR-DNA, Anton Zvonov, Part 1, Activities (жизненный цикл)
DIOR-DNA, Anton Zvonov, Part 1, Activities (жизненный цикл)
 
Android - 10 - Graphics
Android - 10 - GraphicsAndroid - 10 - Graphics
Android - 10 - Graphics
 
Push Notifications (Lecture 22 – push notifications)
Push Notifications (Lecture 22 – push notifications)Push Notifications (Lecture 22 – push notifications)
Push Notifications (Lecture 22 – push notifications)
 

Similar to Database (Lecture 14 – database)

Java осень 2012 лекция 8
Java осень 2012 лекция 8Java осень 2012 лекция 8
Java осень 2012 лекция 8
Technopark
 
паттерны проектирования источников данных
паттерны проектирования источников данныхпаттерны проектирования источников данных
паттерны проектирования источников данных
Vitaliy Trenkenshu
 
Java осень 2013 лекция 8
Java осень 2013 лекция 8Java осень 2013 лекция 8
Java осень 2013 лекция 8
Technopark
 
Java весна 2013 лекция 8
Java весна 2013 лекция 8Java весна 2013 лекция 8
Java весна 2013 лекция 8
Technopark
 
IOP202 DevCon 2012 Apache Lucene in Windows Azure
IOP202 DevCon 2012 Apache Lucene in Windows AzureIOP202 DevCon 2012 Apache Lucene in Windows Azure
IOP202 DevCon 2012 Apache Lucene in Windows Azure
Vadim Novitskiy
 

Similar to Database (Lecture 14 – database) (20)

Android - 13 - Database
Android - 13 - DatabaseAndroid - 13 - Database
Android - 13 - Database
 
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!
 
Java осень 2014 занятие 8
Java осень 2014 занятие 8Java осень 2014 занятие 8
Java осень 2014 занятие 8
 
Java осень 2012 лекция 8
Java осень 2012 лекция 8Java осень 2012 лекция 8
Java осень 2012 лекция 8
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
 
Основы Java. 5. Databases
Основы Java. 5. DatabasesОсновы Java. 5. Databases
Основы Java. 5. Databases
 
C# Desktop. Занятие 12.
C# Desktop. Занятие 12.C# Desktop. Занятие 12.
C# Desktop. Занятие 12.
 
UWDC 2013, Yii2
UWDC 2013, Yii2UWDC 2013, Yii2
UWDC 2013, Yii2
 
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
 
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
 
JSSDK: Начало
JSSDK: НачалоJSSDK: Начало
JSSDK: Начало
 
Паттерны проектирования источников данных
Паттерны проектирования источников данныхПаттерны проектирования источников данных
Паттерны проектирования источников данных
 
паттерны проектирования источников данных
паттерны проектирования источников данныхпаттерны проектирования источников данных
паттерны проектирования источников данных
 
Java осень 2013 лекция 8
Java осень 2013 лекция 8Java осень 2013 лекция 8
Java осень 2013 лекция 8
 
Java весна 2013 лекция 8
Java весна 2013 лекция 8Java весна 2013 лекция 8
Java весна 2013 лекция 8
 
Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"Михаил Давыдов "Масштабируемые JavaScript-приложения"
Михаил Давыдов "Масштабируемые JavaScript-приложения"
 
JDBC
JDBCJDBC
JDBC
 
The Old New ASP.NET
The Old New ASP.NETThe Old New ASP.NET
The Old New ASP.NET
 
IOP202 DevCon 2012 Apache Lucene in Windows Azure
IOP202 DevCon 2012 Apache Lucene in Windows AzureIOP202 DevCon 2012 Apache Lucene in Windows Azure
IOP202 DevCon 2012 Apache Lucene in Windows Azure
 

More from Noveo

Fragments (Lecture 09 – Fragments)
Fragments (Lecture 09 – Fragments)Fragments (Lecture 09 – Fragments)
Fragments (Lecture 09 – Fragments)
Noveo
 

More from Noveo (20)

Гуманитарные специальности в IT-индустрии
Гуманитарные специальности в IT-индустрииГуманитарные специальности в IT-индустрии
Гуманитарные специальности в IT-индустрии
 
Box model, display and position (HTML5 тема 07 - box model, display position)
Box model, display and position (HTML5 тема 07 - box model, display position)Box model, display and position (HTML5 тема 07 - box model, display position)
Box model, display and position (HTML5 тема 07 - box model, display position)
 
Основы CSS (HTML5 тема 02 - основы CSS)
Основы CSS (HTML5 тема 02 - основы CSS)Основы CSS (HTML5 тема 02 - основы CSS)
Основы CSS (HTML5 тема 02 - основы CSS)
 
Структура HTML документа (HTML5 тема 01 - структура html документа)
Структура HTML документа (HTML5 тема 01 - структура html документа)Структура HTML документа (HTML5 тема 01 - структура html документа)
Структура HTML документа (HTML5 тема 01 - структура html документа)
 
Yii2
Yii2Yii2
Yii2
 
Сессии и авторизация
Сессии и авторизацияСессии и авторизация
Сессии и авторизация
 
Rest
RestRest
Rest
 
PHP basic
PHP basicPHP basic
PHP basic
 
PHP Advanced
PHP AdvancedPHP Advanced
PHP Advanced
 
PHP and MySQL
PHP and MySQLPHP and MySQL
PHP and MySQL
 
MySQL
MySQLMySQL
MySQL
 
RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)
 
Работа с геоданными (Lecture 18 – geolocation)
Работа с геоданными (Lecture 18 – geolocation)Работа с геоданными (Lecture 18 – geolocation)
Работа с геоданными (Lecture 18 – geolocation)
 
Material Design (Lecture 15 – material design)
Material Design (Lecture 15 – material design)Material Design (Lecture 15 – material design)
Material Design (Lecture 15 – material design)
 
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
 
XML, JSON (Lecture 11 – XML, JSON)
XML, JSON (Lecture 11 – XML, JSON)XML, JSON (Lecture 11 – XML, JSON)
XML, JSON (Lecture 11 – XML, JSON)
 
Работа с графической подсистемой (Lecture 10 – Graphics)
Работа с графической подсистемой (Lecture 10 – Graphics)Работа с графической подсистемой (Lecture 10 – Graphics)
Работа с графической подсистемой (Lecture 10 – Graphics)
 
Fragments (Lecture 09 – Fragments)
Fragments (Lecture 09 – Fragments)Fragments (Lecture 09 – Fragments)
Fragments (Lecture 09 – Fragments)
 
Android - 16 - QR
Android - 16 - QRAndroid - 16 - QR
Android - 16 - QR
 
03 коллекции
03   коллекции03   коллекции
03 коллекции
 

Database (Lecture 14 – database)

  • 2. SQLite встраиваемая реляционная база данных открытый исходный код. нет отдельного сервера высокая скорость небольшой расход памяти поддержка стандартных возможностей реляционных БД – синтаксис SQL, транзакции и prepared statements вся база данных в одном файле кроссплатформенная http://sqlite.org
  • 3. SQLite в Android доступно на любом устройстве Android не требует установки БД или администрирования вся работа с базой данных должна быть в отдельном потоке файл БД хранится в каталоге приложения
  • 4. SQLite в Android Contract class SQL Helper SQLiteDatabase Cursor CursorAdapter CursorLoader
  • 5. Contract class Хранит константы, определяющие имена для ваших URI, таблиц, колонок. Best practice: создаем класс, который будет хранить константы для всей базы данных создаем внутренние классы с константами для каждой таблицы реализуем интерфейс BaseColumns
  • 6. SQLiteOpenHelper Абстрактный класс, с помощью которого можно создавать, открывать и обновлять базу данных Создаем наследника и переопределяем следующие методы: onCreate() - вызывается при первом создании базы данных onUpgrade() - вызывается при модификации базы данных Должен быть singleton Поле id в таблице должно именоваться _id (На самом деле, нет) close() - закрыть базу. getReadableDatabase()/getWritableDatabase() - создают и/или открывают БД. Возвращают объект SQLiteDatabase
  • 7. SQLiteDatabase Работает с базой данных SQLite напрямую, содержит методы: insert() update()- Используют ContentValues delete() query() - делает запрос к таблице и возвращает Cursor rawQuery() - исполняет sql запрос и возвращает Cursor execSQL() - выполнение одного sql запроса. (NOT a SELECT/INSERT/UPDATE/DELETE)
  • 8. Cursor Возвращается на запрос к базе данных, и предоставляет доступ к результатам запроса. Содержит методы: moveToFirst() moveToNext() типизированные методы getInt(); getLong();getString(); etc getColumnIndex() close()
  • 9. CursorAdapter Адаптер, который отображает данные из курсора на ListView Курсор должен включать столбец с названием "_id" или этот класс не будет работать
  • 10. CursorLoader Позволяет выполнять запросы в отдельном потоке Наследник AsyncTaskLoader’а Loaders API
  • 11. Content Provider Класс для обмена данными между приложениями. 1 <provider 2 android:authorities="com.noveo.internship.db.exampleContentProvider" 3 android:name=".database.ExampleContentProvider" 4 android:multiprocess="true" 5 android:exported="false" />
  • 12. Content Provider Создаем наследника и переопределяем методы: onCreate() query() getType() insert() update() delete()
  • 13. Content Provider При работе с провайдером используются URI. 1 content://<authority>/<path>/<id> authority - уникальное имя ContentProvider-а path - какие данные нужны (имя таблицы) id - идентификатор записи. content://com.noveo.db.provider/toys/5 content://com.noveo.db.provider/toys
  • 14. UriMatcher служит для определения деталей запроса к контент- провайдеру отображает URI разных видов на целочисленные константы полезен в случаях, когда обслуживаются разные URI для доступа к одному и тому же источнику данных Пример: Если URI оканчивается на /toys - это запрос про все игрушки Если на toys/[ID] - про конкретную игрушку
  • 15. Жизнь одного запроса 1. вызываем getContentResolver().query(Uri, String, String, String, String) 2. СontentResolver анализирует Uri и извлекает от туда authority 3. ContentResolver направляет запрос к ContentProvider-у зарегестрированному по этому authority (уникальному) 4. ContentProvider выполняет запрос и возвращает Cursor (или исключение)
  • 16. Sql to No-Sql Когда нет желания создавать под каждую сущность отдельную таблицу. Делаем универсальную таблицу с: id object_name object_version object_data Сравниваем object_version класса object_name с object_version в БД. Достаем object_data и парсимкастуем к object_name типу.
  • 17. ORM (object-relational mapping) технология, связывающая таблицы в базе данных с объектами в приложени для решения данной задачи в Android можно использовать ORMLite
  • 18. ORMLite открытый исходный код поддержка SQLite простые аннотации, быстрый старт при этом все гибко настраивается, нужно только залезть в документацию http://ormlite.com/ http://habrahabr.ru/post/143431/
  • 19. ORMLite. Модели 1 @DatabaseTable(tableName = "accounts") 2 public class Account { 3 4 public static final String NAME_FIELD_NAME = "name"; 5 public static final String PASSWORD_FIELD_NAME = "passwd"; 6 7 @DatabaseField(generatedId = true) 8 private int id; 9 @DatabaseField(columnName = NAME_FIELD_NAME, canBeNull = false) 10 private String name; 11 @DatabaseField(columnName = PASSWORD_FIELD_NAME) 12 private String password; 13 @ForeignCollectionField 14 private ForeignCollection<Order> orders; 15 16 Account() { 17 // Пустой конструктор обязательно должен быть(если есть непустые) 18 } 19 // Другие конструкторы 20 // Геттеры, сеттеры и проч. 21 }
  • 20. ORMLite. DAO (Data Access Object) Для каждого класса модели создается DAO (Класс наследник от BaseDaoImpl) 1 public class AccountDAO extends BaseDaoImpl<Account, Integer>{ 2 3 protected AccountDAO(ConnectionSource connectionSource, 4 Class<Account> dataClass) throws SQLException{ 5 super(connectionSource, dataClass); 6 } 7 8 public List<Account> getAllAccounts() throws SQLException{ 9 return this.queryForAll(); 10 } 11 }
  • 21. ORMLite. DatabaseHelper Наследуется от OrmLiteSqliteOpenHelper Реализует методы: onCreate(), onUpgrade() Создает DAO для классов, содержит методы для получения этих DAO Должен быть синглтоном
  • 22. ORMLite. Работа с данными 1 AccountDAO accountDao = DatabaseHelper.getHelper().getAccountDao(); 2 List<Account> accounts = accountDao.getAllAccounts(); 3 for (Account account : accounts) { 4 account.setPassword("new_password"); 5 accountDao.update(account); 6 }
  • 23. Realm Использует собственное хранилище объектов, а не SQLite Разрабатывалась специально под мобильные платформы Не работает на Java вне Android'а В операциях чтения показывает производительность выше, чем raw SQLite (в операциях записи ниже)
  • 24. Realm. Модели Модели должны наследоваться от RealmObject 1 public class Person extends RealmObject { 2 3 // По-умолчанию все поля сохраняются в хранилище 4 private String name; 5 private int age; 6 7 // ... Геттеры-сеттеры и т.д. 8 }
  • 25. Realm. Транзакции 1 RealmConfiguration realmCfg = new RealmConfiguration.Builder(context).build(); 2 Realm realm = Realm.getInstance(realmCfg); 3 4 final Person person = realm.where(Person.class).findFirst(); 5 6 realm.executeTransaction(new Realm.Transaction() { 7 @Override 8 public void execute(Realm realm) { 9 person.setName("Senior Person"); 10 person.setAge(99); 11 } 12 });
  • 26. Realm. Асинхронное выполнение операций 1 RealAsyncTask transaction = realm.executeTransactionAsync(new Realm.Transaction() { 2 @Override 3 public void execute(Realm bgRealm) { 4 //do something 5 } 6 }, new Realm.Transaction.OnSuccess() { 7 @Override 8 public void onSuccess() { 9 // Transaction was a success. 10 } 11 }, new Realm.Transaction.OnError() { 12 @Override 13 public void onError(Throwable error) { 14 // Transaction failed and was automatically canceled. 15 } 16 });
  • 27. Realm. Асинхронное выполнение операций Асинхронные транзакции нужно отменять, если они больше не нужны. 1 public void onStop () { 2 if (transaction != null && !transaction.isCancelled()) { 3 transaction.cancel(); 4 } 5 }
  • 28. Realm. Ограничения и недостатки Вложенные транзакции не поддерживаются Имя модели должно быть не больше 57 символов, имя поля - 63 символов String и byte[] должны быть не больше 16Мб RealmObject’ы не могут быть ключом в HashMap и храниться в HashSet Есть некоторые проблемы с сортировкой и поиском по non-Latin строкам
  • 29. Debug 1. Через adb shell. cd /data/data/ cd com.noveo.internship.db cd databases находим файл нашей БД, test.db, например, и цепляемся туда. sqlite3 test.db Нужен рут. Что делать без рута?
  • 30. Debug Сторонние решения. Например Stetho от FB. Позволяет многие вещи, в том числе и инспекцию БД. SQLite databases can be visualized and interactively explored with full read/write capabilities. Stetho