Аннотация
В мобильных приложениях в ряде случаев может быть полезно использование простой внутренней базы данных, такой как SQLite. В этой статье мы рассматриваем API Android* SQLite и вспомогательные классы для создания и обслуживания баз данных. Мы обсудим создание и использование заранее заполненной базы данных, а также будем использовать SQLite для создания внутренней базы данных для образца ресторанного приложения.
Содержание
Аннотация
Обзор
Образец приложения для ресторана – Little Chef.
Использование существующей базы данных
Доступ к элементам меню из базы данных ресторана
Заключение
Обзор
В Android существует встроенная поддержка базы данных SQLite. Поддерживаются все функции SQLite, предоставляется API оболочки с совместимым интерфейсом. Подробные сведения см. по приведенной ниже ссылке.
http://developer.android.com/guide/topics/data/data-storage.html#db
API Android SQLite является типичным; разработчику следует реализовать всю обработку базы данных, включая создание, управление версиями, обновления базы данных и прочие настройки. Если нужно использовать заранее заполненную базу данных SQLite, требуется дополнительная настройка.
Приведенное ниже учебное руководство содержит подробные сведения по использованию стандартного API Android SQLite.
http://developer.android.com/training/basics/data-storage/databases.html
Прямое использование API Android SQLite может привести к написанию большого количества шаблонного кода. Существует несколько библиотек Android, помогающих упростить этот процесс. Они обладают и рядом других возможностей в дополнение к удобному и эффективному использованию баз данных SQLite в приложениях Android.
SQLiteAssetHelper - одна из таких библиотек. Эта библиотека популярна в сообществе разработчиков Android. Полные сведения см. на следующем веб-сайте: https://github.com/jgilfelt/android-sqlite-asset-helper
Образец приложения для ресторана — Little Chef.
Мы будем использовать образец приложения для ресторана (Little Chef), чтобы продемонстрировать использование базы данных SQLite и библиотеки SQLiteAssetHelper library.
Это приложение позволяет пользователю просматривать различные категории меню и выбирать различные элементы.
Figure 1: A Restaurant Sample App - Little Chef
Это приложение для ресторана может быть использовано поваром или пользователем для просмотра различных категорий и элементов меню. В образце приложения используется жест прокрутки для переключения между категориями, а при выборе какого-либо элемента в меню отображаются подробные сведения.
Для сохранения всех категорий меню и подробных сведений об элементах можно использовать базу данных SQLite. В дальнейших версиях приложения можно расширить базу данных, чтобы поддерживать другие виды данных приложения: данные о продажах, о программах лояльности клиентов, индивидуальные настройки для каждого пользователя и т.д.
Использование существующей базы данных
В зависимости от требований к приложению может потребоваться заранее заполнить базу данных приложения начальным набором данных. В случае с ресторанным приложением заранее заполняется базовый набор стандартных категорий меню и сведений о каждом элементе меню.
Android API (например, SQLiteOpenHelper) можно использовать для заполнения первоначального набора данных при создании и инициализации базы данных. Тем не менее такой подход не всегда оптимален, особенно при большом объеме набора данных. Кроме того, не рекомендуется использовать некоторые вызовы SQLiteOpenHelperв главном потоке. В зависимости от мощности устройства пользователи могут столкнуться с длительной инициализацией и значительными задержками в работе пользовательского интерфейса при запуске. Еще один возможный подход — заранее заполнить базу данных и упаковать ее в составе ресурсов приложения.
Для образца ресторанного приложения мы создали базу данных SQLite автономно, используя API программирования python для SQLite. Существуют и клиенты с графическим пользовательским интерфейсом, позволяющие вручную добавлять данные в базы данных SQLite и редактировать эти данные. Согласно рекомендации в документации к API Android SQLite, мы добавили столбец «_id» для уникальной идентификации каждой строки. Это будет полезно при реализации абстракций поставщика содержимого и адаптера.
Для доступа к базе данных SQLite из папки assets приложения с помощью интерфейсов API Android SQLite требуется скопировать файл базы данных из папки assets в папку, соответствующую пути к базе данных приложения. Ситуация дополнительно усложняется, если нужно реализовать поддержку обновления базы данных и управления версиями.
Для образца ресторанного приложения мы используем библиотеку SQLiteAssetHelper*, чтобы получить доступ к заранее заполненной базе данных, упакованной в составе ресурсов приложения. Подробные инструкции по использованию см. в документе README для библиотеки SQLiteAssetHelper.
https://github.com/jgilfelt/android-sqlite-asset-helper
Мы создали папку databases внутри папки assets и скопировали заранее заполненный файл restaurant.sqliteв папку databases. Подробные сведения см. в следующем фрагменте кода.
package com.example.restaurant; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteQueryBuilder; import com.readystatesoftware.sqliteasset.SQLiteAssetHelper; /** * Database handler for restaurant app. */ public class RestaurantDatabase extends SQLiteAssetHelper { private static final String TAG = SQLiteAssetHelper.class.getSimpleName(); private static final String DATABASE_NAME = "restaurant.sqlite"; private static final int DATABASE_VERSION = 1; public interface TABLES { String MENU = "menu"; String USER = "user"; String CUSTOMER = "customer"; } public interface MenuColumns { String CATEGORY = "category"; String NAME = "name"; String DESCRIPTION = "description"; String NUTRITION = "nutrition"; String PRICE = "price"; String IMAGENAME = "imagename"; } public RestaurantDatabase(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } public Cursor getMenuItems() { SQLiteDatabase db = getReadableDatabase(); SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); qb.setTables(TABLES.MENU); Cursor c = qb.query(db, null, null, null, null, null, null); c.moveToFirst(); return c; } }
Фрагмент кода 1. Использование заранее заполненной базы данных ++
Доступ к элементам меню из базы данных ресторана
При инициализации SQLiteAssetHelperавтоматически скопирует заранее заполненную базу данных ресторана из папки assets по соответствующему пути к базе данных. Последующие вызовы будут снова использовать этот экземпляр базы данных до тех пор, пока не будет запрошено обновление. В приведенном выше фрагменте кода показан метод getMenuItems, возвращающий указатели для всех элементов меню в базе данных.
В следующем фрагменте кода показано создание экземпляра базы данных и разбор элементов меню от указателя.
mDb = new RestaurantDatabase(this); mMenuItems = new ArrayList<MenuItem>(); Set<String> categories = new HashSet<String>(); Cursor c = mDb.getMenuItems(); while (c.moveToNext()) { String category = c.getString(c.getColumnIndexOrThrow(RestaurantDatabase.MenuColumns.CATEGORY)); categories.add(category); MenuItem menuItem = new MenuItem(); menuItem.setCategory(category); menuItem.setName(c.getString(c.getColumnIndexOrThrow(RestaurantDatabase.MenuColumns.NAME))); menuItem.setDescription(c.getString(c.getColumnIndexOrThrow(RestaurantDatabase.MenuColumns.DESCRIPTION))); menuItem.setNutrition(c.getString(c.getColumnIndexOrThrow(RestaurantDatabase.MenuColumns.NUTRITION))); menuItem.setPrice(c.getString(c.getColumnIndexOrThrow(RestaurantDatabase.MenuColumns.PRICE))); menuItem.setImageName(c.getString(c.getColumnIndexOrThrow(RestaurantDatabase.MenuColumns.IMAGENAME))); mMenuItems.add(menuItem); } c.close(); mCategoryList = new ArrayList<String>(categories);
Фрагмент кода 2. Доступ к элементам меню из базы данных ++
Не рекомендуется обрабатывать доступ к базе данных в главном потоке. Можно использовать SQLiteAssetHelperдля добавления дополнительных абстракций, таких как интерфейс поставщика содержимого Android.
В зависимости от требованиях к приложению и сценариев использования можно добавить в ресторанное приложение и другие возможности: поддержку обновления базы данных, управление версиями и даже поддержку серверов. При серверной реализации внутренней базы данных мы можем использовать локальную базу данных SQLite в качестве временного кеша и для возможности автономной работы.
Заключение
В этой статье мы обсудили использование базы данных SQLite в приложениях Android. Мы обсудили API Android SQLite и вспомогательные классы. Мы использовали образец ресторанного приложения для демонстрации использования заранее заполненных баз данных с библиотекой SQLiteAssetHelper.
Об авторе
Ашок Эмани (Ashok Emani) работает инженером по программному обеспечению в отделе Intel Software and Services Group. В настоящее время он занимается проектами по масштабированию систем на основе процессоров Intel® Atom™.
Примечания
ИНФОРМАЦИЯ В ДАННОМ ДОКУМЕНТЕ ПРИВЕДЕНА ТОЛЬКО В ОТНОШЕНИИ ПРОДУКТОВ INTEL. ДАННЫЙ ДОКУМЕНТ НЕ ПРЕДОСТАВЛЯЕТ ЯВНОЙ ИЛИ ПОДРАЗУМЕВАЕМОЙ ЛИЦЕНЗИИ, ЛИШЕНИЯ ПРАВА ВОЗРАЖЕНИЯ ИЛИ ИНЫХ ПРАВ НА ИНТЕЛЛЕКТУАЛЬНУЮ СОБСТВЕННОСТЬ. КРОМЕ СЛУЧАЕВ, УКАЗАННЫХ В УСЛОВИЯХ И ПРАВИЛАХ ПРОДАЖИ ТАКИХ ПРОДУКТОВ, INTEL НЕ НЕСЕТ НИКАКОЙ ОТВЕТСТВЕННОСТИ И ОТКАЗЫВАЕТСЯ ОТ ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ ГАРАНТИЙ В ОТНОШЕНИИ ПРОДАЖИ И/ИЛИ ИСПОЛЬЗОВАНИЯ СВОИХ ПРОДУКТОВ, ВКЛЮЧАЯ ОТВЕТСТВЕННОСТЬ ИЛИ ГАРАНТИИ ОТНОСИТЕЛЬНО ИХ ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ, ОБЕСПЕЧЕНИЯ ПРИБЫЛИ ИЛИ НАРУШЕНИЯ КАКИХ-ЛИБО ПАТЕНТОВ, АВТОРСКИХ ПРАВ ИЛИ ИНЫХ ПРАВ НА ИНТЕЛЛЕКТУАЛЬНУЮ СОБСТВЕННОСТЬ.
КРОМЕ СЛУЧАЕВ, СОГЛАСОВАННЫХ INTEL В ПИСЬМЕННОЙ ФОРМЕ, ПРОДУКТЫ INTEL НЕ ПРЕДНАЗНАЧЕНЫ ДЛЯ ИСПОЛЬЗОВАНИЯ В СИТУАЦИЯХ, КОГДА ИХ НЕИСПРАВНОСТЬ МОЖЕТ ПРИВЕСТИ К ТРАВМАМ ИЛИ ЛЕТАЛЬНОМУ ИСХОДУ.
Корпорация Intel оставляет за собой право вносить изменения в технические характеристики и описания своих продуктов без предварительного уведомления. Проектировщики не должны полагаться на отсутствующие характеристики, а также характеристики с пометками «зарезервировано» или «не определено». Эти характеристики резервируются Intel для будущего использования, поэтому отсутствие конфликтов совместимости для них не гарантируется. Информация в данном документе может быть изменена без предварительного уведомления. Не используйте эту информацию в окончательном варианте дизайна.
Продукты, описанные в данном документе, могут содержать ошибки и неточности, из-за чего реальные характеристики продуктов могут отличаться от приведенных здесь. Уже выявленные ошибки могут быть предоставлены по запросу.
Перед размещением заказа получите последние версии спецификаций в региональном офисе продаж Intel или у местного дистрибьютора.
Копии документов с порядковым номером, ссылки на которые содержатся в этом документе, а также другую литературу Intel можно получить, позвонив по телефону 1-800-548-4725 либо на сайте: http://www.intel.com/design/literature.htm
Программное обеспечение и нагрузки, использованные в тестах производительности, могли быть оптимизированы для достижения высокой производительности на микропроцессорах Intel. Тесты производительности, такие как SYSmark* и MobileMark*, проводятся на определенных компьютерных системах, компонентах, программах, операциях и функциях. Любые изменения любого из этих элементов могут привести к изменению результатов. При выборе приобретаемых продуктов следует обращаться к другой информации и тестам производительности, в том числе к тестам производительности определенного продукта в сочетании с другими продуктами.
Данный документ и описываемое в нем программное обеспечение предоставляются по лицензии и могут использоваться и распространяться только согласно условиям лицензии.