Transcript

SQLite и Android

SQLite в AndroidContentProvider

11:02 2 из 80

Что такое SQLite?

● База данных с открытым исходным кодом.

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 8 из 80

Особенности SQLite в Android

● SQLite интегрирован во все Android устройства.

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 14 из 80

Создание и обновление БД

● Создать класс-наследник класса SQLiteOpenHelper.

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 19 из 80

Класс SQLiteDatabase

● Базовый класс для работы с БД SQLite.

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 26 из 80

Класс ContentValues

● Определяет пары ключ/значение.

11:02 27 из 80

Класс ContentValues

● Определяет пары ключ/значение.

● Ключ — имя столбца таблицы.

11:02 28 из 80

Класс ContentValues

● Определяет пары ключ/значение.

● Ключ — имя столбца таблицы.

● Значение — содержимое записи в данном столбце.

11:02 29 из 80

Класс ContentValues

● Определяет пары ключ/значение.

● Ключ — имя столбца таблицы.

● Значение — содержимое записи в данном столбце.

● Используется для добавления/обновления данных в БД.

11:02 30 из 80

Класс Cursor

● Запрос возвращает объект типа Cursor.

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()

ContentProvider в Android

ContentProvider

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 42 из 80

Доступ к ContentProvider

● Доступ к ContentProvider осуществляется по URI.

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 52 из 80

Безопасность ContentProvider

● android:exported="true|false"

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 58 из 80

Класс Loader

● Позволяет асинхронно загружать данные в activity.

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 64 из 80

Реализация Loader

● Реализовать класс-наследник от AsyncTaskLoader.

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 72 из 80

SQLite и CursorLoader

● CursorLoader — реализации Loader для БД SQLite.

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 76 из 80

Доступ к SQLite БД через shell

● БД SQLite храниться в одном файле.

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


Top Related