Лекция android. БД sqlite, contentprovider, loader
DESCRIPTION
Лекция по БД SQLite, ContentProvider, Loader в Android. Общее знакомство с классами и работой с БД.TRANSCRIPT
11:02 3 из 80
Что такое SQLite?
● База данных с открытым исходным кодом.
● Поддерживает SQL, транзакции и процедуры.
11:02 4 из 80
Что такое SQLite?
● База данных с открытым исходным кодом.
● Поддерживает SQL, транзакции и процедуры.
● Не требует много ресурсов (примерно 250 кБ памяти).
11:02 5 из 80
Что такое SQLite?
● База данных с открытым исходным кодом.
● Поддерживает SQL, транзакции и процедуры.
● Не требует много ресурсов (примерно 250 кБ памяти).
● Является встраиваемой библитекой.
11:02 6 из 80
Что такое SQLite?
● База данных с открытым исходным кодом.
● Поддерживает SQL, транзакции и процедуры.
● Не требует много ресурсов (примерно 250 кБ памяти).
● Является встраиваемой библитекой.
● 3 основных типа данных: TEXT, INTEGER, REAL.
11:02 7 из 80
Что такое SQLite?
● База данных с открытым исходным кодом.
● Поддерживает SQL, транзакции и процедуры.
● Не требует много ресурсов (примерно 250 кБ памяти).
● Является встраиваемой библитекой.
● 3 основных типа данных: TEXT, INTEGER, REAL.
● Всё содержимое БД храниться в одном файле.
11:02 9 из 80
Особенности SQLite в Android
● SQLite интегрирован во все Android устройства.
● Не требуется установка или настройка БД.
11:02 10 из 80
Особенности SQLite в Android
● SQLite интегрирован во все Android устройства.
● Не требуется установка или настройка БД.
● Необходимо определить только процедуры создания и обновления БД.
11:02 11 из 80
Особенности SQLite в Android
● SQLite интегрирован во все Android устройства.
● Не требуется установка или настройка БД.
● Необходимо определить только процедуры создания и обновления БД.
● Выполняется обращение к файлам устройства.
11:02 12 из 80
Особенности SQLite в Android
● SQLite интегрирован во все Android устройства.
● Не требуется установка или настройка БД.
● Необходимо определить только процедуры создания и обновления БД.
● Выполняется обращение к файлам устройства.
● Желательно выполнять запросы асинхронно (в отдельном потоке).
11:02 13 из 80
Особенности SQLite в Android
● SQLite интегрирован во все Android устройства.
● Не требуется установка или настройка БД.
● Необходимо определить только процедуры создания и обновления БД.
● Выполняется обращение к файлам устройства.
● Желательно выполнять запросы асинхронно (в отдельном потоке).
● Файл БД храниться в каталоге приложения:
DATA/data/ИМЯ_ПРИЛОЖЕНИЯ/databases/ИМЯ_ФАЙЛА
DATA/data/com.bstu.test/databases/test.db
11:02 15 из 80
Создание и обновление БД
● Создать класс-наследник класса SQLiteOpenHelper.
● Вызвать конструктор родителя с параметрами:
имя_бд и версия_бд.
11:02 16 из 80
Создание и обновление БД
● Создать класс-наследник класса SQLiteOpenHelper.
● Вызвать конструктор родителя с параметрами:
имя_бд и версия_бд.
● Переопределить методы onCreate() и onUpgrade().
11:02 17 из 80
Создание и обновление БД
● Создать класс-наследник класса SQLiteOpenHelper.
● Вызвать конструктор родителя с параметрами:
имя_бд и версия_бд.
● Переопределить методы onCreate() и onUpgrade().
● Параметром методов является класс SQLiteDatabase.
11:02 18 из 80
Создание и обновление БД
● Создать класс-наследник класса SQLiteOpenHelper.
● Вызвать конструктор родителя с параметрами:
имя_бд и версия_бд.
● Переопределить методы onCreate() и onUpgrade().
● Параметром методов является класс SQLiteDatabase.
● getReadableDatabase() и getWritableDatabase() предоставляют доступ к БД.
11:02 20 из 80
Класс SQLiteDatabase
● Базовый класс для работы с БД SQLite.
● Предоставляет методы для выполнения запросов к БД, открытия/обновления/закрытия БД.
11:02 21 из 80
Класс SQLiteDatabase
● Базовый класс для работы с БД SQLite.
● Предоставляет методы для выполнения запросов к БД, открытия/обновления/закрытия БД.
● insert(), update(), delete().
11:02 22 из 80
Класс SQLiteDatabase
● Базовый класс для работы с БД SQLite.
● Предоставляет методы для выполнения запросов к БД, открытия/обновления/закрытия БД.
● insert(), update(), delete().
● execSQL().
11:02 23 из 80
Класс SQLiteDatabase
● Базовый класс для работы с БД SQLite.
● Предоставляет методы для выполнения запросов к БД, открытия/обновления/закрытия БД.
● insert(), update(), delete().
● execSQL().
● Запросы к БД выполняются через
– rawQuery()
– query()
– SQLiteQueryBuilder класс
11:02 24 из 80
Примеры запросов к БД
● rawQuery():
getReadableDatabase().rawQuery("select * from todo where _id = ?", new String[] { id });
● query():
database.query(DATABSE_TABLE, new String[] { KEY_ROWID, KEY_CATEGORY, KEY_SUMMARY }, null, null, null, null, null);
11:02 25 из 80
Параметры метода query()
Параметр Описание
String dbName Название таблицы, для которой выполняется запрос.
String[] columnNames
Список столбцов, которые нужно вернуть. null — все столбцы.
String whereClause
Раздел where sql-запроса, фильтрует результат. null — все данные.
String[] selectionArgs
Знаки «?» в разделе where заменяются значениями из массива selectionArgs.
String[] groupBy Определяет группировку столбцов.
String[] having Фильтр групп
String[] orderBy Столбцы, по которым данные сортируются
11:02 28 из 80
Класс ContentValues
● Определяет пары ключ/значение.
● Ключ — имя столбца таблицы.
● Значение — содержимое записи в данном столбце.
11:02 29 из 80
Класс ContentValues
● Определяет пары ключ/значение.
● Ключ — имя столбца таблицы.
● Значение — содержимое записи в данном столбце.
● Используется для добавления/обновления данных в БД.
11:02 31 из 80
Класс Cursor
● Запрос возвращает объект типа Cursor.
● Cursor указывает на одну строку результата.
11:02 32 из 80
Класс Cursor
● Запрос возвращает объект типа Cursor.
● Cursor указывает на одну строку результата.
● getCount().
11:02 33 из 80
Класс Cursor
● Запрос возвращает объект типа Cursor.
● Cursor указывает на одну строку результата.
● getCount().
● moveToFirst(), moveToNext(), isAfterLast().
11:02 34 из 80
Класс Cursor
● Запрос возвращает объект типа Cursor.
● Cursor указывает на одну строку результата.
● getCount().
● moveToFirst(), moveToNext(), isAfterLast().
● Типизированные методы get*() для извлечения данных (getLong(columnIndex), getString(columnIndex)).
11:02 35 из 80
Класс Cursor
● Запрос возвращает объект типа Cursor.
● Cursor указывает на одну строку результата.
● getCount().
● moveToFirst(), moveToNext(), isAfterLast().
● Типизированные методы get*() для извлечения данных (getLong(columnIndex), getString(columnIndex)).
● getColumnIndex(columnName)
11:02 36 из 80
Класс Cursor
● Запрос возвращает объект типа Cursor.
● Cursor указывает на одну строку результата.
● getCount().
● moveToFirst(), moveToNext(), isAfterLast().
● Типизированные методы get*() для извлечения данных (getLong(columnIndex), getString(columnIndex)).
● getColumnIndex(columnName)
● close()
11:02 38 из 80
Что такое ContentProvider?
● Позволяет приложениям получать доступ к структурированным данным.
11:02 39 из 80
Что такое ContentProvider?
● Позволяет приложениям получать доступ к структурированным данным.
● Помогает приложениям «делиться» своими данными с другими приложениями (напр., получить доступ к списку контактов).
11:02 40 из 80
Что такое ContentProvider?
● Позволяет приложениям получать доступ к структурированным данным.
● Помогает приложениям «делиться» своими данными с другими приложениями (напр., получить доступ к списку контактов).
● Должен быть объявлен в файле AndroidManifest.xml
11:02 41 из 80
Что такое ContentProvider?
● Позволяет приложениям получать доступ к структурированным данным.
● Помогает приложениям «делиться» своими данными с другими приложениями (напр., получить доступ к списку контактов).
● Должен быть объявлен в файле AndroidManifest.xml
● Собственный ContentProvider нужен только для предоставления «своих» данных другим приложениям
11:02 43 из 80
Доступ к ContentProvider
● Доступ к ContentProvider осуществляется по URI.
● URI передается объекту ContentResolver.
11:02 44 из 80
Доступ к ContentProvider
● Доступ к ContentProvider осуществляется по URI.
● URI передается объекту ContentResolver.
● URI состоит из имени ContentProvider (authority) и имени таблицы (path).
11:02 45 из 80
Доступ к ContentProvider
● Доступ к ContentProvider осуществляется по URI.
● URI передается объекту ContentResolver.
● URI состоит из имени ContentProvider (authority) и имени таблицы (path).
content://com.bstu.test/test
11:02 46 из 80
Доступ к ContentProvider
● Доступ к ContentProvider осуществляется по URI.
● URI передается объекту ContentResolver.
● URI состоит из имени ContentProvider (authority) и имени таблицы (path).
content://com.bstu.test/test
● content:// - схема данных.
11:02 47 из 80
Доступ к ContentProvider
● Доступ к ContentProvider осуществляется по URI.
● URI передается объекту ContentResolver.
● URI состоит из имени ContentProvider (authority) и имени таблицы (path).
content://com.bstu.test/test
● content:// - схема данных.
// URI данных в таблице слов// Столбцы, которые нужно вернуть// Критерий отбора (where)// Аргументы отбора// Порядок сортировки строк
// Запрашивает пользовательский словарь и возвращает данныеmCursor = getContentResolver().query( UserDictionary.Words.CONTENT_URI, mProjection, mSelectionClause mSelectionArgs, mSortOrder);
11:02 48 из 80
Реализация собственного ContentProvider
● Реализовать класс-наследник от ContentProvider.
11:02 49 из 80
Реализация собственного ContentProvider
● Реализовать класс-наследник от ContentProvider.
● Объявить в AndroidManifest.xml.
<provider android:authorities="com.bstu.test" android:name=".MyTestContentProvider" android:exported="true" ></provider>
11:02 50 из 80
Реализация собственного ContentProvider
● Реализовать класс-наследник от ContentProvider.
● Объявить в AndroidManifest.xml.
● Реализовать методы
– query() - возвращает Cursor
– insert()
– update()
– delete()
– getType()
– onCreate()
11:02 51 из 80
Реализация собственного ContentProvider
● Реализовать класс-наследник от ContentProvider.
● Объявить в AndroidManifest.xml.
● Реализовать методы
– query() - возвращает Cursor
– insert()
– update()
– delete()
– getType()
– onCreate() UnsupportedOperationException()
11:02 53 из 80
Безопасность ContentProvider
● android:exported="true|false"
● Необходимо следить за потоко-безопасностью.
11:02 54 из 80
Безопасность ContentProvider
● android:exported="true|false"
● Необходимо следить за потоко-безопасностью.
● Ключевое слово synchronized.
11:02 55 из 80
Безопасность ContentProvider
● android:exported="true|false"
● Необходимо следить за потоко-безопасностью.
● Ключевое слово synchronized.
● android:multiprocess="true".
11:02 56 из 80
Безопасность ContentProvider
● android:exported="true|false"
● Необходимо следить за потоко-безопасностью.
● Ключевое слово synchronized.
● android:multiprocess="true".
– создает объект ContentProvider в каждом запросившем процессе;
11:02 57 из 80
Безопасность ContentProvider
● android:exported="true|false"
● Необходимо следить за потоко-безопасностью.
● Ключевое слово synchronized.
● android:multiprocess="true".
– создает объект ContentProvider в каждом запросившем процессе;
– нет необходимости в межпроцессорном обмене (IPC).
11:02 59 из 80
Класс Loader
● Позволяет асинхронно загружать данные в activity.
● Обновляет данные при из изменении.
11:02 60 из 80
Класс Loader
● Позволяет асинхронно загружать данные в activity.
● Обновляет данные при из изменении.
● Сохраняет данные при изменении конфигурации.
11:02 61 из 80
Класс Loader
● Позволяет асинхронно загружать данные в activity.
● Обновляет данные при из изменении.
● Сохраняет данные при изменении конфигурации.
● Может кэшировать данные.
11:02 62 из 80
Класс Loader
● Позволяет асинхронно загружать данные в activity.
● Обновляет данные при из изменении.
● Сохраняет данные при изменении конфигурации.
● Может кэшировать данные.
● Впервые появились в Android 3.0.
11:02 63 из 80
Класс Loader
● Позволяет асинхронно загружать данные в activity.
● Обновляет данные при из изменении.
● Сохраняет данные при изменении конфигурации.
● Может кэшировать данные.
● Впервые появились в Android 3.0.
● Совместим вниз до Android 1.6 (Android support library)
11:02 65 из 80
Реализация Loader
● Реализовать класс-наследник от AsyncTaskLoader.
● LoaderManager управляет объектами типа Loader.
11:02 66 из 80
Реализация Loader
● Реализовать класс-наследник от AsyncTaskLoader.
● LoaderManager управляет объектами типа Loader.
● Получения Loader:
getLoaderManager().initLoader(0, null, this);
11:02 67 из 80
Реализация Loader
● Реализовать класс-наследник от AsyncTaskLoader.
● LoaderManager управляет объектами типа Loader.
● Получения Loader:
getLoaderManager().initLoader(0, null, this);
– уникальный ID;
11:02 68 из 80
Реализация Loader
● Реализовать класс-наследник от AsyncTaskLoader.
● LoaderManager управляет объектами типа Loader.
● Получения Loader:
getLoaderManager().initLoader(0, null, this);
– уникальный ID;
– Bundle, для передачи каких-либо данных;
11:02 69 из 80
Реализация Loader
● Реализовать класс-наследник от AsyncTaskLoader.
● LoaderManager управляет объектами типа Loader.
● Получения Loader:
getLoaderManager().initLoader(0, null, this);
– уникальный ID;
– Bundle, для передачи каких-либо данных;
– класс реализующий интерфейс LoaderManager.LoaderCallbacks (обычно activity).
11:02 70 из 80
Реализация Loader
● Реализовать класс-наследник от AsyncTaskLoader.
● LoaderManager управляет объектами типа Loader.
● Получения Loader:
getLoaderManager().initLoader(0, null, this);
● Создание происходит в callback-методе onCreateLoader().
11:02 71 из 80
Реализация Loader
● Реализовать класс-наследник от AsyncTaskLoader.
● LoaderManager управляет объектами типа Loader.
● Получения Loader:
getLoaderManager().initLoader(0, null, this);
● Создание происходит в callback-методе onCreateLoader().
● После завершения загрузки вызывается onLoadFinished().
11:02 73 из 80
SQLite и CursorLoader
● CursorLoader — реализации Loader для БД SQLite.
● Выполняет загрузку данных в фоне, не блокируя поток приложения.
11:02 74 из 80
SQLite и CursorLoader
● CursorLoader — реализации Loader для БД SQLite.
● Выполняет загрузку данных в фоне, не блокируя поток приложения.
● Если Cursor требует обновления, вызывается метод onLoaderReset().
11:02 75 из 80
SQLite и CursorLoader
● CursorLoader — реализации Loader для БД SQLite.
● Выполняет загрузку данных в фоне, не блокируя поток приложения.
● Если Cursor требует обновления, вызывается метод onLoaderReset().
● Переподключает Cursor при изменении конфигурации.
11:02 77 из 80
Доступ к SQLite БД через shell
● БД SQLite храниться в одном файле.
● Доступен в эмуляторе и устройствах с правами root.
11:02 78 из 80
Доступ к SQLite БД через shell
● БД SQLite храниться в одном файле.
● Доступен в эмуляторе и устройствах с правами root.
● adb shell — подключение к устройству
11:02 79 из 80
Доступ к SQLite БД через shell
● БД SQLite храниться в одном файле.
● Доступен в эмуляторе и устройствах с правами root.
● adb shell — подключение к устройству
# Переходим в каталог datacd /data/data# Наше приложениеcd com.bstu.test# Заходим в каталог databasescd databases# Проверяем содержимоеls# Предполагаем, что есть файл БД test.db# подключаемся к этой БДsqlite3 test.db
11:02 80 из 80
Полезные ссылки
● http://www.vogella.com● http://www.sqlite.org● http://d.android.com