mobile fest#spb 2012

24
Android: Секреты удобного хранения данных Дмитрий Викторович Малыханов DataArt http://www.dataart.com/

Upload: dmalykhanov

Post on 16-Jun-2015

350 views

Category:

Documents


0 download

DESCRIPTION

Секреты удобного хранения данных

TRANSCRIPT

Page 1: Mobile Fest#spb 2012

Android:Секреты удобного хранения данных

Дмитрий Викторович МалыхановDataArt

http://www.dataart.com/

Page 2: Mobile Fest#spb 2012

● Shared Preferences● Internal/External Storage● SQLite Databases

● Content Provider

Способы хранения данных

http://goo.gl/r673r

Page 3: Mobile Fest#spb 2012

● Унифицированный интерфейс● Асинхронные уведомления● Маскировка деталей реализации● Прозрачное хранение файлов● Безопасность● Работа в отдельном процессе

ПреимуществаContent Provider

Page 4: Mobile Fest#spb 2012

● IPC вызовы (marshalling)● Кажущееся усложнение кода● Надуманные проблемы с транзакциями

Осложнения

Page 5: Mobile Fest#spb 2012

"Вечный" сервис

SQLite Динамическая типизация(читайте: строковые данные)

"Под капотом"

http://goo.gl/igQqT

Page 6: Mobile Fest#spb 2012

Инициализация должна быть БЫСТРОЙ!

см. ContentProvider.onCreate() javadoc

Оптимизация:Шаг первый

http://goo.gl/pdBY5

Page 7: Mobile Fest#spb 2012

Разгружаем UI thread:

Избегайте лишних преобразований типов!

Оптимизация:Шаг второй

Page 8: Mobile Fest#spb 2012

Практически бесполезно

рекомендация:только в сочетании с CASCADE

Оптимизация:Внешние ключи

Page 9: Mobile Fest#spb 2012

VIEW вместо сложных JOIN'ов

значительное упрощение кода

Оптимизация:Соединения

Page 10: Mobile Fest#spb 2012

Все обращения кContentProvider вне UI thread!

AsyncTask, Handler,AsyncQueryHandler

LoaderManager

Оптимизация:AsyncQueryHanlder

http://goo.gl/1fpOi

Page 11: Mobile Fest#spb 2012

Категории:● Item● Directory

Идентификатор категории в ID UriMatcher'а

Оптимизация:Упрощение кода

http://goo.gl/A1wqF

Page 12: Mobile Fest#spb 2012

int MASK_TYPE = 0x0000000F;

int TYPE_ITEM = 0x00000001;

int TYPE_DIR = 0x00000002;

...

switch (matcher.match(uri) & MASK_TYPE) {

case TYPE_ITEM:

return "vnd.android.cursor.item/NAME";

case TYPE_DIR:

return "vnd.android.cursor.dir/NAME";

...

Пример:Категории в ID

Page 13: Mobile Fest#spb 2012

Зачастую данные изменяются только на сервере:

int rows = resolver.update(...)

if (0 == rows) {

resolver.insert(...);

}

Оптимизация:Конфликты

Page 14: Mobile Fest#spb 2012

SQLiteDatabase:

public long insertWithOnConflict (String table,

String nullColumnHack,

ContentValues initialValues,

int conflictAlgorithm)

SQLiteDatabase.CONFLICT_REPLACE

API 8+

Разрешение конфликтов

http://goo.gl/dU1fo

Page 15: Mobile Fest#spb 2012

Архитектурные проблемы!

Загрузите XML/CSV в Provider:

ContentResolver.openOutputStream(uri, mode)

ContentProvider.openFileDescriptor(uri, mode)

Большой импорт:Маскировка проблем

http://goo.gl/UlJInhttp://goo.gl/VOF9m

Page 16: Mobile Fest#spb 2012

Batch Access:

ContentProviderResult[] applyBatch (String authority, ArrayList<ContentProviderOperation> operations)

Расход памяти!

Большой импорт:Решение

http://goo.gl/1AX8Q

Page 17: Mobile Fest#spb 2012

android.net.Uri:● scheme● authority● path● fragment● query

Вся сила URI

http://goo.gl/bSwjG

Page 18: Mobile Fest#spb 2012

Перерасход ресурсов UI thread

Решение:Пропускать ненужные уведомления

Content Provider:Уведомления

Page 19: Mobile Fest#spb 2012

final static String FRG_SKIP_NOTIFY =

"skip-notify";

...

private boolean isNotifyRequired(Uri uri) {

return !FRG_SKIP_NOTIFY.equals(

uri.getFragment());

}

Пропускаем уведомления (1/3)

Page 20: Mobile Fest#spb 2012

public int update(Uri uri, ...) {

...

int rows = ... update ...;

if (rows > 0 && isNotifyRequired(uri)) {

resolver.notifyChange(uri, null);

}

...

Пропускаем уведомления (2/3)

Page 21: Mobile Fest#spb 2012

// client code, e.g. your networking service

Uri uri = ... Uri.Builder ...

.fragment(FRG_SKIP_NOTIFY);

...

// build batch of ops with uri

resolver.applyBatch(...);

resolver.notifyChange(uri, null);

Пропускаем уведомления (3/3)

http://goo.gl/FLbVX

Page 22: Mobile Fest#spb 2012

Дополнительные данные:

Uri:● fragment● query

ContentResolver:● openOutputStream

Оптимизация:Шаг последний

Page 23: Mobile Fest#spb 2012

Android:Секреты удобного хранения данных

ВОПРОСЫ ?

Page 24: Mobile Fest#spb 2012

Android:Секреты удобного хранения данных

Дмитрий Викторович МалыхановDataArt

http://www.dataart.com/