Android:Секреты удобногохранения данныхДмитрий Викторович Малыханов           DataArt    http://www.dataart.com/
Способы хранения                            данных●   Shared Preferences●   Internal/External Storage●   SQLite Databases●...
Преимущества                 Content Provider●   Унифицированный интерфейс●   Асинхронные уведомления●   Маскировка детале...
Осложнения● IPC вызовы (marshalling)● Кажущееся усложнение кода● Надуманные проблемы с транзакциями
"Под капотом""Вечный" сервисSQLite Динамическая типизация (читайте: строковые данные)                  http://goo.gl/igQqT
Оптимизация:                  Шаг первыйИнициализация должна   быть БЫСТРОЙ!  см. ContentProvider.onCreate() javadoc      ...
Оптимизация:           Шаг второй   Разгружаем UI thread:  Избегайте лишнихпреобразований типов!
Оптимизация:            Внешние ключи  Практически бесполезно         рекомендация:только в сочетании с CASCADE
Оптимизация:            СоединенияVIEW вместо сложных JOINовзначительное упрощение кода
Оптимизация:                 AsyncQueryHanlderВсе обращения кContentProvider вне UI thread!        AsyncTask, Handler,    ...
Оптимизация:                  Упрощение кода          Категории:          ● Item          ● DirectoryИдентификатор категор...
Пример:                      Категории в IDint MASK_TYPE = 0x0000000F;int TYPE_ITEM = 0x00000001;int TYPE_DIR = 0x00000002...
Оптимизация:                КонфликтыЗачастую данные изменяются только           на сервере:   int rows = resolver.update(...
Разрешение                            конфликтовSQLiteDatabase:public long   insertWithOnConflict     (String table,      ...
Большой импорт:                     Маскировка проблем     Архитектурные проблемы!    Загрузите XML/CSV в Provider:Content...
Большой импорт:                      Решение               Batch Access:ContentProviderResult[]   applyBatch     (String a...
Вся сила URIandroid.net.Uri:● scheme● authority● path● fragment● query             http://goo.gl/bSwjG
Content Provider:               Уведомления  Перерасход ресурсов UI thread           Решение:Пропускать ненужные уведомления
Пропускаем                      уведомления (1/3)final static String FRG_SKIP_NOTIFY =    "skip-notify";...private boolean...
Пропускаем                      уведомления (2/3)public int update(Uri uri, ...) {    ...    int rows = ... update ...;   ...
Пропускаем                        уведомления (3/3)// client code, e.g. your networking serviceUri uri = ... Uri.Builder ....
Оптимизация:                 Шаг последнийДополнительные данные:             Uri:             ● fragment             ● que...
Android:Секреты удобногохранения данных    ВОПРОСЫ ?
Android:Секреты удобногохранения данныхДмитрий Викторович Малыханов           DataArt    http://www.dataart.com/
Upcoming SlideShare
Loading in …5
×

Mobile Fest#spb 2012

510 views
415 views

Published on

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

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
510
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Mobile Fest#spb 2012

  1. 1. Android:Секреты удобногохранения данныхДмитрий Викторович Малыханов DataArt http://www.dataart.com/
  2. 2. Способы хранения данных● Shared Preferences● Internal/External Storage● SQLite Databases● Content Provider http://goo.gl/r673r
  3. 3. Преимущества Content Provider● Унифицированный интерфейс● Асинхронные уведомления● Маскировка деталей реализации● Прозрачное хранение файлов● Безопасность● Работа в отдельном процессе
  4. 4. Осложнения● IPC вызовы (marshalling)● Кажущееся усложнение кода● Надуманные проблемы с транзакциями
  5. 5. "Под капотом""Вечный" сервисSQLite Динамическая типизация (читайте: строковые данные) http://goo.gl/igQqT
  6. 6. Оптимизация: Шаг первыйИнициализация должна быть БЫСТРОЙ! см. ContentProvider.onCreate() javadoc http://goo.gl/pdBY5
  7. 7. Оптимизация: Шаг второй Разгружаем UI thread: Избегайте лишнихпреобразований типов!
  8. 8. Оптимизация: Внешние ключи Практически бесполезно рекомендация:только в сочетании с CASCADE
  9. 9. Оптимизация: СоединенияVIEW вместо сложных JOINовзначительное упрощение кода
  10. 10. Оптимизация: AsyncQueryHanlderВсе обращения кContentProvider вне UI thread! AsyncTask, Handler, AsyncQueryHandler LoaderManager http://goo.gl/1fpOi
  11. 11. Оптимизация: Упрощение кода Категории: ● Item ● DirectoryИдентификатор категории в ID UriMatcherа http://goo.gl/A1wqF
  12. 12. Пример: Категории в IDint 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";...
  13. 13. Оптимизация: КонфликтыЗачастую данные изменяются только на сервере: int rows = resolver.update(...) if (0 == rows) { resolver.insert(...); }
  14. 14. Разрешение конфликтовSQLiteDatabase:public long insertWithOnConflict (String table, String nullColumnHack, ContentValues initialValues, int conflictAlgorithm) SQLiteDatabase.CONFLICT_REPLACE API 8+ http://goo.gl/dU1fo
  15. 15. Большой импорт: Маскировка проблем Архитектурные проблемы! Загрузите XML/CSV в Provider:ContentResolver.openOutputStream(uri, mode)ContentProvider.openFileDescriptor(uri, mode) http://goo.gl/UlJIn http://goo.gl/VOF9m
  16. 16. Большой импорт: Решение Batch Access:ContentProviderResult[] applyBatch (String authority,ArrayList<ContentProviderOperation> operations) Расход памяти! http://goo.gl/1AX8Q
  17. 17. Вся сила URIandroid.net.Uri:● scheme● authority● path● fragment● query http://goo.gl/bSwjG
  18. 18. Content Provider: Уведомления Перерасход ресурсов UI thread Решение:Пропускать ненужные уведомления
  19. 19. Пропускаем уведомления (1/3)final static String FRG_SKIP_NOTIFY = "skip-notify";...private boolean isNotifyRequired(Uri uri) { return !FRG_SKIP_NOTIFY.equals( uri.getFragment());}
  20. 20. Пропускаем уведомления (2/3)public int update(Uri uri, ...) { ... int rows = ... update ...; if (rows > 0 && isNotifyRequired(uri)) { resolver.notifyChange(uri, null); } ...
  21. 21. Пропускаем уведомления (3/3)// client code, e.g. your networking serviceUri uri = ... Uri.Builder ... .fragment(FRG_SKIP_NOTIFY);... // build batch of ops with uri resolver.applyBatch(...); resolver.notifyChange(uri, null); http://goo.gl/FLbVX
  22. 22. Оптимизация: Шаг последнийДополнительные данные: Uri: ● fragment ● query ContentResolver: ● openOutputStream
  23. 23. Android:Секреты удобногохранения данных ВОПРОСЫ ?
  24. 24. Android:Секреты удобногохранения данныхДмитрий Викторович Малыханов DataArt http://www.dataart.com/

×