Android осень 2013 лекция 6

18

Transcript of Android осень 2013 лекция 6

Page 1: Android осень 2013 лекция 6
Page 2: Android осень 2013 лекция 6

SQlite

2

Встраиваемая

Реляционная

Open source

База данных – один файл

Быстрая

Блокирующаяся

Покрыта тестами Используется в Qt, Skype,

Навигаторыб iOS и проч. http://www.sqlite.org/lang.ht

ml

Page 3: Android осень 2013 лекция 6

Database in Android

android.database.sqlite

Schema и Contract

SQLiteDatabase

SQLiteOpenHelper

_ID

3

Page 4: Android осень 2013 лекция 6

Database Contract

4

Page 5: Android осень 2013 лекция 6

Use Contract

5

Page 6: Android осень 2013 лекция 6

SQLiteOpenHelper

6

Page 7: Android осень 2013 лекция 6

Insert

7

Page 8: Android осень 2013 лекция 6

Query

8

Page 9: Android осень 2013 лекция 6

Update

9

Page 10: Android осень 2013 лекция 6

Cursors

Virtual Table

Набор строк

Структура с данными

moveToFirst()

Названия столбцов

Тип столбцов

close()

10

Page 11: Android осень 2013 лекция 6

Loaders

Появились в 3.0(есть в support library)

Основная задача: асинхронная загрузка данных в активити или фрагмент

Следят за источником данных

Основные классы:

LoaderManager

LoaderCallbacks

Loader

CursorLoader

AsyncTaskLoader

11

Page 12: Android осень 2013 лекция 6

LoaderCallbacks

12

public class SampleActivity extends Activity implementsLoaderManager.LoaderCallbacks<D> {

public Loader<D> onCreateLoader(int id, Bundle args) { ... }

public void onLoadFinished(Loader<D> loader, D data) { ... }

public void onLoaderReset(Loader<D> loader) { ... }

/* ... */

}

Page 13: Android осень 2013 лекция 6

Simple Loader Example

13

public class SampleListActivity extends ListActivity implements LoaderManager.LoaderCallbacks<Cursor> {

private static final String[] PROJECTION = new String[] { "_id", "text_column" };

private static final int LOADER_ID = 1;

private LoaderManager.LoaderCallbacks<Cursor> mCallbacks;

private SimpleCursorAdapter mAdapter;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

String[] dataColumns = { "text_column" };

int[] viewIDs = { R.id.text_view };

mAdapter = new SimpleCursorAdapter(this, R.layout.list_item,

null, dataColumns, viewIDs, 0);

setListAdapter(mAdapter);

mCallbacks = this;

LoaderManager lm = getLoaderManager();

lm.initLoader(LOADER_ID, null, mCallbacks);

}

Page 14: Android осень 2013 лекция 6

Simple Loader Example

14

@Override

public Loader<Cursor> onCreateLoader(int id, Bundle args) {

return new CursorLoader(SampleListActivity.this, CONTENT_URI,

PROJECTION, null, null, null);

}

@Override

public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {

switch (loader.getId()) {

case LOADER_ID:

mAdapter.swapCursor(cursor);

break;

}

}

@Override

public void onLoaderReset(Loader<Cursor> loader) {

mAdapter.swapCursor(null);

}

Page 15: Android осень 2013 лекция 6

Implementing Loaders

Инкапсулируют загрузку данных

Не нужно задумываться о потоках

Event-driven

Четыре характеристики:

AsyncTask

Listener для «доставки» данных

Одно из трех состояний:

Started

Stopped

Reset

Следит за изменением контента и перезапрашивает его

15

Page 16: Android осень 2013 лекция 6

ContentProvider

16

Page 17: Android осень 2013 лекция 6

ContentProvider

Инкапсуляция данных

Механизм доступа к данным

Интерфейс – CRUD

URI

Batch Operations

Permissions

Представление данных в виде таблицы

ContentResolver.query

Нужно ли создавать провайдер, если вы не собираетесь шарить данные?

Системные провайдеры

17

Page 18: Android осень 2013 лекция 6

URI

Идентификация данных

Идентификация провайдера: authority

Путь до таблицы: path

content://user_dictionary/words

Uri singleUri = ContentUris.withAppendedId(UserDictionary.Words.CONTENT_URI,4);

18