SlideShare a Scribd company logo
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

PDF
Клиент-серверное взаимодействие под android в деталях
PDF
Лекция Android. БД SQLite, ContentProvider, Loader
PDF
Java осень 2014 занятие 7
PPT
Yii development
PPT
Сергей Париев - "обработка дедлоков в MySql"
PPTX
Ilia kantor паттерны серверных comet решений
PPT
Эффективное программирование на NodeJS
PDF
Александр Сычев "Разделяй и властвуй: CQRS в iOS"
Клиент-серверное взаимодействие под android в деталях
Лекция Android. БД SQLite, ContentProvider, Loader
Java осень 2014 занятие 7
Yii development
Сергей Париев - "обработка дедлоков в MySql"
Ilia kantor паттерны серверных comet решений
Эффективное программирование на NodeJS
Александр Сычев "Разделяй и властвуй: CQRS в iOS"

What's hot (19)

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

Viewers also liked (20)

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

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

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

More from Noveo (20)

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