Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Dive Into Android. Работа с БД. Content Providers.

Dive Into Android. Работа с БД. Content Providers.

Alex Korovyansky

November 10, 2013
Tweet

More Decks by Alex Korovyansky

Other Decks in Programming

Transcript

  1. 5 Способы сохранения данных • Shared Preferences • Internal Storage

    • External Storage • SQLite Databases • Network Connection
  2. 6 Мотивация использовать БД • Необходимость сохранить данные во внешней

    памяти • Данные со сложной структурой и связью • Большой объем данных • Необходимость выполнять операции изменения, объединения, сортировки...
  3. 8 Введение в SQLite • Open Source библиотека на C

    • Встраивается в приложение • Легкая и мощная • Полная документация http://sqlite.org
  4. 9 ContentValues • Представляет строку таблицы • Добавление получение элемента

    по строковому ключу ContentValues cv = new ContentValues(); cv.put("column_name", value); cv.putAll(otherCv); cv.containsKey("column_name"); cv.get("column_name"); cv.remove("content_key");
  5. 10 SQLiteCursor • Представляет результаты запроса к БД • Чтение

    данных и перемещение по ним Cursor cursor = db.query(TABLE_NAME, columns, where, whereArgs, null, null, null); if (cursor.moveToFirst()) { do { int data = cursor.getInt(cursor.getColumnInde(DataTable.INT_VALUE)); ... } while (cursor.moveToNext()); }
  6. 11 SQLiteOpenHelper • Вспомогательный класс для создания, обновления БД class

    DatabaseHelper extends SQLiteOpenHelper { public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { //создание БД db.execSQL(CREATE_TABLE_STATEMENT); ... } @Override public void onUpgrade(SQLiteDatabase db, int ov, int nv){ //обновление БД до новой версии } }
  7. 12 SQLiteOpenHelper • Использование в клиенте: databaseHelper = new DatabaseHelper(context);

    ... SQLiteDatabase db = databaseHelper.getReadableDatabase(); //чтение db.close(); ... SQLiteDatabase db = databaseHelper.getWritableDatabase(); //запись db.close(); • SQLiteOpenHelper позаботится обо всем, нужно только указать в каком режиме открыть БД
  8. 13 Структура таблиц • Структуру таблиц рекомендуется определять в отдельном

    классе, например, DataTables public class DataTables { public static final class Persons implements BaseColumns { //cтруктура таблицы public static final String DEFAULT_SORT_ORDER = "name DESC"; public static final String NAME = "name"; public static final String AGE = "age"; //вспомогательный метод public static ContentValues makeContentValues(Person p){ ContentValues contentValues = new ContentValues(); contentValues.put(NAME, p.name); contentValues.put(AGE, p.age); return contentValues; } } //другие таблицы ... }
  9. 14 Операции БД • insert - добавление новых данных •

    query/rawQuery - получение данных • update - обновление данных • delete - удаление данных • execSQL - произвольный запрос • http://d.android.com/reference/android/ database/sqlite/SQLiteDatabase.html
  10. 15 Поддержка транзакций • Транзакция - атомарный набор операций db.beginTransactionWithListener(listener);

    try { ... db.setTransactionSuccessful(); } finally { db.endTransaction(); } db.beginTransaction(); try { ... db.setTransactionSuccessful(); } finally { db.endTransaction(); }
  11. 17 Замечания • Разные версии Android имеют разные версии SQLite

    с разными возможностями • Используйте SQLiteOpenHelper • В большинстве случаев БД создается во внутренней файловой системе • В этом случае права на чтение БД имеет только приложение-владелец
  12. 20 Content Providers • Компонент Android приложения • «Данные» •

    insert, query, update, delete... • IPC • Например, ContentProvider в Контактах
  13. 21 Content Providers • Объявление в манифесте: • Динамический СontentProvider

    и объявление его в коде практически бесмысленны <provider android:name="string" android:authorities="list" android:name="string" ...> ... </provider>
  14. 22 Content Providers • Основные методы ContentProvider: • query -

    получение данных • insert - добавление данных • update - обновление данных • delete - удаление данных • getType - получение типа данных • openFile - открытие файла • Во всех методах присутствует параметр Uri, идентификатор ресурса в провайдере
  15. 23 Роль URI • Клиенты будут работать с провайдером формируя

    необходимые URI • Общий вид URI: content://com.<CompanyName>.provider.<ApplicationName>/<DataPath> • Связь с authorities провайдера в манифесте android:authorities = “com.<CompanyName>.provider.<ApplicationName>” • Доступ к набору: content://com.<CompanyName>.provider.<ApplicationName>/<Set> • Доступ к элементу: content://com.<CompanyName>.provider.<ApplicationName>/<Set>/<Element>
  16. 24 ContentResolver • Клиенты должны получить объект класса ContentResolver для

    работы с провайдером • ContentResolver позволяет выполнить операции query, insert, update, delete для указанных Uri ContentResolver cr = Context.getContentResolver(); Cursor allRows = cr.query(contentUri, null, null, null, null); Cursor someRows = cr.query(contentUri, null, where, null, null); • ContentResolver обеспечивает связь между клиентом и провайдером, связанным с данным Uri