sqlite на андроид что это

Применение SQLiteOpenHelper и Database Inspector в Android-разработке

Что такое SQLite?

SQLite — это опенсорсная реляционная СУБД, похожая на MySQL. SQLite входит в состав стандартной библиотеки Android, где реализован движок базы данных, не нуждающийся в применении клиент-серверной архитектуры, не требующий особой настройки, поддерживающий транзакции. Для работы SQLite не нужен сервер баз данных. Всё, что нужно, хранится в обычных файлах. Полноценная БД SQLite, в которой имеется множество таблиц, триггеров, индексов и представлений, содержится в единственном, самом обыкновенном файле. Стандартная поддержка СУБД SQLite имеется во всех мобильных телефонах и в большинстве компьютеров. При этом работа с SQLite не требует решения задач по администрированию или настройке баз данных.

Класс SQLiteOpenHelper

▍Метод onCreate()

Вот код конструктора DatabaseHelper :

▍Метод onUpgrade()

Метод onUpgrade() вызывается в тех случаях, когда нужно обновить версию существующей базы данных:

▍Пример

Вот содержимое файла MainActivity.java :

Вот содержимое Employee.java :

Вот файл DatabaseHelper.java :

Database Inspector в Android Studio

Инструмент Database Inspector позволяет исследовать базы данных, используемые в приложениях, выполнять запросы к ним, модифицировать их, делая всё это во время работы приложений. Database Inspector имеется в Android Studio начиная с версии 4.1. Этот инструмент особенно полезен при отладке механизмов программ, ответственных за работу с базами данных. Database Inspector работает и с обычной реализацией SQLite, и с библиотеками, построенными на её основе, вроде Room. Database Inspector работает лишь с библиотекой SQLite, входящей в состав операционных систем Android, уровень API которых не ниже 26.

Для того чтобы открыть базу данных в Database Inspector нужно выполнить следующие действия:

Исследование базы данных с помощью Database Inspector

Обратите внимание на то, что есть одна проблема, связанная с аварийным завершением работы программ на эмуляторе Android 11 при подключении к Database Inspector. Если вы с этой проблемой столкнётесь — здесь вы можете найти сведения о том, как с ней справиться.

Применяете ли вы SQLite в Android-разработке?

Источник

Рекомендации по использованию SQLite на мобильных устройствах

В буржунете есть интересный документ по оптимизации SQLite на платформе BlackBerry. Однако, идеи, которые в нем содержатся, вообще говоря, относятся к любой мобильной платформе. Мы решили развить этот список и создать эдакий эталонный текст в рунете с набором полезных, вводных советов для программирования SQLite под мобильными устройствами. Принимаем ваши предложения в комментариях.

Всегда используйте кодировку UTF-8

Это оптимальный вариант по быстродействию и размеру занимаемой памяти (внутри себя SQLite все запросы переводит в UTF-8, поскольку имеет встроенный парсер только этой кодировки).

Храните в базе как можно меньше данных

Этот совет не от капитана Очевидности. Не используйте SQLite просто потому, что это «модно». Продумайте альтернативы: XML, например. За использование SQLite нужно платить тратой ресурсов.

Всегда явно управляйте транзакциями

Иначе на каждую команду SQL будет создаваться и фиксироваться отдельная, неявная транзакция. Группируйте изменения данных.

Тщательно продумывайте создание индексов

Индексы ускоряют выборку, но замедляют модификацию данных. Иногда полезно использовать covering индексы, когда в определение индекса включаются поля с данными:

Теперь, если выбирать (по условию на key1 и key2) данные столбцов data1, data2, data2, SQLite может взять их значения из самого индекса (нет необходимости дополнительного чтения данных из таблицы). Но такой индекс занимает больше места. Поэтому, следующий совет:

Лучший способ проверить что-то: тестировать на конкретном устройстве

И, разумеется, не на пустой базе. Заполните ее случайными данными, если нет подходящих. Иначе быстродействие в реальном сценарии вас неприятно удивит.

Продумайте как хранить BLOBы

На официальном сайте приводится тест, который показывает, что при использовании BLOBов следует:
— поставить размер страницы побольше (8192 или 16384);
— большие BLOBы хранить в отдельных файлах.
Если вы решили хранить BLOBы в базе, заведите отдельную таблицу под них:

и в таблицах с данными поставьте поле со ссылкой на запись в этой таблице. Это совет от самих разработчиков SQLite.

Используйте временные таблицы

Если при создании таблицы, вы указали «TEMP»

то созданная таблица будет уничтожена автоматически при закрытии базы данных.

Используйте параметризованные запросы

То есть передавайте значения в SQL запросы не в виде литералов внутри SQL, а привязывая их к параметрам. Это одновременно обезопасит ваш код от атак SQL injection и повысит быстродействие.

Добавьте AUTOINCREMENT в определение PRIMARY KEY

является синонимом поля ROWID (уникального идентификатора записи). Хитрость в том, что SQLite не гарантирует, что новые строки получат новые ключи, если ранее записи удалялись из таблицы. Если вам требуется «настоящая уникальность» идентификаторов добавьте к определению AUTOINCREMENT:

Теперь при любых обстоятельствах новая строка получит уникальное значение id (и rowid) (ну или вы исчерпаете 8-байтный счетчик).

Используйте внешние ключи (FOREIGN KEY) только если это действительно нужно

В SQLite имеется довольно развитый механизм поддержки внешних ключей. По умолчанию, он отключен (для совместимости). С одной стороны, внешние ключи гарантируют целостность. С другой — требуют ресурсов. Если вы все-таки решите их использовать, то…

По каждому полю внешнего ключа создайте индекс

Допустим, есть пара таблиц:

При удалении записи из master таблицы, SQLite должен проверить — не ссылается ли на нее какая-то запись в таблице detail и делает дополнительную выборку:

Как правило, разработчики забывают создать индекс по FK ключу и эта выборка работает очень долго.

Удаление данных из базы не уменьшает размер ее файла

Чтобы сжать файл базы данных, выполните

Эта операция требует времени.

Ну и самый главный совет.

Тщательно продумайте схему БД

Обычно вначале данные максимально нормализуют, а затем выполняют денормализацию для оптимизации. Например, если у пользователя часто требуют название его отдела, можно это название продублировать в таблице пользователей отдельным полем. Задумайтесь, какие данные меняются в вашей БД наиболее интенсивно, возможно, их следует выделить в отдельную таблицу.

Как выполнить сразу несколько операторов SQL?

Объедините их в одну строку через «;».

Как быстро добавить много записей (bulk insert)?

Перед вставкой большого числа записей выполните

Читайте также:  аципол или линекс что лучше для ребенка при запорах

Вставляйте записи. Наибольшей производительности можно достигнуть, откомпилировав (prepare) оператор вставки с параметрами и многократно выполнив его с требуемыми значениями. После вставки восстановите настройки (приводятся настройки по умолчанию):

Создавать индексы по таблице лучше после вставки, а не до. Учтите, что при отключенном журнале база может оказаться испорченной, если приложение «вылетит» в процессе вставки.

PS. Используй современный менеджер для администрирования базы данных SQLite.

Источник

Использование SQLite.NET с Android

Библиотека SQLite.NET, которую Xamarin рекомендует, — это очень простая модель ORM, которая позволяет легко хранить и извлекать объекты в локальной базе данных SQLite на устройстве Android. ORM означает объектно-реляционное сопоставление – API, который позволяет сохранять и извлекать «объекты» из базы данных без написания инструкций SQL.

чтобы включить библиотеку SQLite.NET в приложение Xamarin, добавьте в проект следующий пакет NuGet:

Доступно несколько различных пакетов SQLite. Убедитесь, что выбран правильный вариант (возможно, он не является самым максимальным результатом поиска).

Получив доступ к библиотеке SQLite.NET, выполните следующие три шага, чтобы использовать ее для доступа к базе данных.

Добавление оператора using – Добавьте следующий оператор в файлы C#, где требуется доступ к данным:

Сохранение данных – После создания объекта Склитеконнектион команды базы данных выполняются путем вызова своих методов, таких как CreateTable и INSERT следующим образом:

Получение данных – Чтобы получить объект (или список объектов), используйте следующий синтаксис:

Пример базового доступа к данным

Пример кода DataAccess_Basic для этого документа выглядит следующим образом при работе в Android. В коде показано, как выполнять простые операции SQLite.NET и выводить результаты в виде текста в главном окне приложения.

Android

В следующем примере кода показано взаимодействие базы данных с использованием библиотеки SQLite.NET для инкапсуляции базового доступа к базе данных. Он показывает:

Создание файла базы данных

Вставка данных путем создания объектов и последующего их сохранения

Необходимо включить следующие пространства имен:

Последний требует добавления SQLite в проект. Обратите внимание, что таблица базы данных SQLite определяется путем добавления атрибутов к классу ( Stock классу), а не CREATE TABLE команде.

Использование [Table] атрибута без указания параметра имени таблицы приведет к тому, что имя базовой таблицы базы данных будет совпадать с именем класса (в данном случае — «фондовой биржи»). фактическое имя таблицы важно, если вы пишете SQL запросы непосредственно в базе данных, а не используете методы доступа к данным ORM. Аналогичным образом [Column(«_id»)] атрибут является необязательным, и при отсутствии столбца в таблицу будет добавлен столбец с тем же именем, что и у свойства в классе.

Атрибуты SQLite

Общие атрибуты, которые можно применять к классам для управления их хранением в базовой базе данных, включают:

[PrimaryKey] – Этот атрибут можно применить к целочисленному свойству, чтобы принудительно использовать первичный ключ базовой таблицы. Составные первичные ключи не поддерживаются.

[Автоувеличение] – Этот атрибут приведет к автоматическому приращению значения целочисленного свойства для каждого нового объекта, вставленного в базу данных

[Column (Name)] – name Параметр задает имя базового столбца базы данных.

[Таблица (имя)] – Помечает класс как способный храниться в базовой таблице SQLite с указанным именем.

[MaxLength (значение)] – Ограничьте длину свойства текста при попыток вставки базы данных. Использование кода должно проверить это перед вставкой объекта, так как этот атрибут является «checked» только при попытке выполнить операцию вставки или обновления базы данных.

[Пропустить] – Приводит к тому, что SQLite.NET игнорирует это свойство. Это особенно полезно для свойств, имеющих тип, который не может храниться в базе данных, или свойства, которые не могут быть автоматически разрешены SQLite.

[Уникальный] – Гарантирует уникальность значений в столбце базовой базы данных.

Большинство этих атрибутов являются необязательными. Всегда следует указывать целочисленный первичный ключ, чтобы можно было эффективно выполнять запросы на выборку и удаление данных.

Более сложные запросы

SQLiteConnection Для выполнения других операций с данными можно использовать следующие методы.

Вставить – Добавляет новый объект в базу данных.

Получить – пытается получить объект, используя первичный ключ.

Таблица – возвращает все объекты в таблице.

Удаление – Удаляет объект, используя его первичный ключ.

Запрос – выполнение SQL запроса, возвращающего несколько строк (в виде объектов).

Выполнение инструкции – используйте этот метод (а не Query ), если не предполагается, что строки возвращаются из SQL (например, инструкции INSERT, UPDATE и DELETE).

Получение объекта по первичному ключу

SQLite.Net предоставляет метод Get для получения одного объекта на основе его первичного ключа.

Выбор объекта с помощью LINQ

Методы, возвращающие поддержку коллекций, IEnumerable поэтому можно использовать LINQ для запроса или сортировки содержимого таблицы. В следующем коде показан пример использования LINQ для фильтрации всех записей, начинающихся с буквы «A»:

Выбор объекта с помощью SQL

Несмотря на то, что SQLite.Net может предоставлять доступ к данным на основе объектов, иногда может потребоваться более сложный запрос, чем разрешено LINQ (или может потребоваться более высокая производительность). с помощью команды SQL можно использовать метод Query, как показано ниже:

при написании инструкций SQL напрямую вы создаете зависимость от имен таблиц и столбцов в базе данных, которые были созданы из классов и их атрибутов. при изменении этих имен в коде следует помнить, что необходимо обновить любые SQL инструкции, написанные вручную.

Удаление объекта

Первичный ключ используется для удаления строки, как показано ниже:

Вы можете проверить, rowcount сколько строк было затронуто (удалено в этом случае).

Использование SQLite.NET с несколькими потоками

SQLite поддерживает три различных режима работы с потоками: один поток, несколько потоков и сериализованный. Если требуется получить доступ к базе данных из нескольких потоков без каких бы то ни было ограничений, можно настроить SQLite для использования сериализованного режима потоков. Важно установить этот режим на ранних этапах работы приложения (например, в начале OnCreate метода).

В самом начале OnCreate метода добавьте этот код, чтобы завершить работу SQLite, настроить его для работы в сериализованном режиме и повторно инициализировать SQLite:

Читайте также:  какие туфли надеть с бордовым платьем

Источник

SQLite на Android

SQLite доступен на любом Android-устройстве, его не нужно устанавливать отдельно.

SQLite поддерживает типы TEXT (аналог String в Java), INTEGER (аналог long в Java) и REAL (аналог double в Java). Остальные типы следует конвертировать, прежде чем сохранять в базе данных. SQLite сама по себе не проверяет типы данных, поэтому вы можете записать целое число в колонку, предназначенную для строк, и наоборот.

Тип Описание
NULL пустое значение
INTEGER целочисленное значение
REAL значение с плавающей точкой
TEXT строки или символы в кодировке UTF-8, UTF-16BE или UTF-16LE
NUMERIC здесь можно хранить булевы значения, а также время и дату
BLOB бинарные данные

Вы не найдёте здесь тип, работающий с датами. Можно использовать строковые значения, например, как 2013-03-28 (28 марта 2013 года). Для даты со временем рекомендуется использовать формат 2013-03-27T07:58. В таких случаях можно использовать некоторые функции SQLite для добавления дней, установки начала месяца и т.д. Учтите, что SQLite не поддерживает часовые пояса.

Также не поддерживается тип boolean. Используйте числа 0 для false и 1 для true.

Не используйте тип BLOB для хранения данных (картинки) в Android. Лучше хранить в базе путь к изображениям, а сами изображения хранить в файловой системе.

Обратите внимание, что здесь не используется популярный в MySQL тип varchar(n), ограничивающий длину строки.

Так как сама база данных SQLite представляет собой файл, то по сути при работе с базой данных, вы взаимодействуете с файлом. Поэтому операции чтения и записи могут быть довольно медленными. Настоятельно рекомендуется использовать асинхронные операции, например, при помощи класса AsyncTask.

Когда ваше приложение создаёт базу данных, она сохраняется в каталоге DATA/data/имя_пакета/databases/имя_базы.db.

Метод Environment.getDataDirectory() возвращает путь к каталогу DATA.

Основными пакетами для работы с базой данных являются android.database и android.database.sqlite.

База данных SQLite доступна только приложению, которое создаёт её. Если вы хотите дать доступ к данным другим приложениям, вы можете использовать контент-провайдеры (ContentProvider).

Запускаем SQLite на эмуляторе

С помощью утилиты ADB можно запустить SQLite на эмуляторе и работать с базами данных напрямую.

Напомню, что можно активировать команду sqlitе3 для одной из перечисленных баз данных, введя следующую команду:

Для завершения работы с sqlite3 напишите:

Описание доступных команд sqlite3 есть на сайте: http://www.sqlite.org/sqlite.html. Перечислим некоторые важные команды.

Чтобы просмотреть список таблиц:

Быстрый доступ к главной таблице:

Это один из способов, позволяющих узнать названия всех столбцов, которые содержатся в таблице базы данных. Можно скопировать базу данных на локальный компьютер и изучать её в более комфортных условиях. Чтобы переместить файл contacts.db, можно дать следующую команду:

Классы для работы с SQLite

Работа с базой данных сводится к следующим задачам:

Класс ContentValues

Класс ContentValues используется для добавления новых строк в таблицу. Каждый объект этого класса представляет собой одну строку таблицы и выглядит как ассоциативный массив с именами столбцов и значениями, которые им соответствуют.

Курсоры

В Android запросы к базе данных возвращают объекты класса Cursor. Вместо того чтобы извлекать данные и возвращать копию значений, курсоры ссылаются на результирующий набор исходных данных. Курсоры позволяют управлять текущей позицией (строкой) в результирующем наборе данных, возвращаемом при запросе.

Класс SQLiteOpenHelper: Создание базы данных

Библиотека Android содержит абстрактный класс SQLiteOpenHelper, с помощью которого можно создавать, открывать и обновлять базы данных. Это основной класс, с которым вам придётся работать в своих проектах. При реализации этого вспомогательного класса от вас скрывается логика, на основе которой принимается решение о создании или обновлении базы данных перед ее открытием. Класс SQLiteOpenHelper содержит два обязательных абстрактных метода:

Также используются другие методы класса:

В приложении необходимо создать собственный класс, наследуемый от SQLiteOpenHelper. В этом классе необходимо реализовать указанные обязательные методы, описав в них логику создания и модификации вашей базы.

В этом же классе принято объявлять открытые строковые константы для названия таблиц и полей создаваемой базы данных, которые клиенты могут использовать для определения столбцов при выполнении запросов к базе данных. Например, так можно объявить константы для таблицы CONTACT:

Лучше, если вы будете давать сразу понятные имена, указывающие на работу с таблицей. Если имя переменной TABLE_NAME ещё можно оставить, то для других лучше использовать более говорящие имена, например, KEY_NAME и KEY_PHONE или COLUMN_NAME, COLUMN_PHONE.

Ваш класс, расширяющий SQLiteOpenHelper, также неявно наследует интерфейс BaseColumns, в котором определена строковая константа _ID, представляющая имя поля для идентификаторов записей. В создаваемых таблицах базы данных поле _ID должно иметь тип INTEGER PRIMARY KEY AUTOINCREMENT. Описатель AUTOINCREMENT является необязательным. Часто в других примерах идентификатор создаётся вручную, смотрите как вам удобнее. Только всегда называйте его именно _id. Такое название используется в Android для работы с курсорами и поэтому придерживайтесь данного правила.

В методе onCreate() необходимо реализовать логику создания таблиц и при необходимости заполнить их начальными данными при помощи SQL-команды, например:

Здесь показана условная команда, в реальном коде вам нужно учитывать пробелы между константами, чтобы получилась правильная строка SQL-команды.

Также надо указать номер версии базы данных, начиная со значения 1. По этому номеру класс-обёртка будет понимать, что структуру базы данных следует обновить.

В методе onUpgrade() можно, например, реализовать запрос в базу данных на уничтожение таблицы (DROP TABLE), после чего вновь вызвать метод onCreate() для создания версии таблицы с обновленной структурой, например, так:

Обновляется структура базы данных следующим образом. Сначала меняем порядковый номер.

При первой установке приложения базы данных ещё не существует. Тут проверять пока нечего. При установке новой версии приложения система проверит номер версии базы данных. Если он больше, чем было, то вызовется метод onUpgrade(). Если наоборот, то вызовется метод onDowngrade() (обычно так происходит редко).

Как использовать? Просто ставим условие на проверку.

Допустим, в таблицу нужно добавить новую колонку в дополнение к существующим колонкам NAME, DESCRIPTION и IMAGE_RESOURCE_ID. Для изменения таблицы используется выражение SQL с ключевым словом ALTER

Читайте также:  Что такое мастит у козы

Для замены имени таблицы используется выражение (меняем имя таблицы DOG на CAT):

Для удаления таблицы:

Соответственно, нужно вызвать метод SQLiteDatabase.execSQL(), передав ему нужную команду SQL.

Для удобства создадим вспомогательный метод updateDatabase().

Созданный метод теперь можно использовать в коде следующим образом.

Чтобы использовать реализацию вспомогательного класса, создайте новый экземпляр, передайте его конструктору контекст, имя базы данных, текущую версию и объект класса CursorFactory (если вы его используете). Вызовите метод getReadableDatabase() или getWritableDatabase(), чтобы открыть и вернуть экземпляр базы данных, с которой мы имеем дело (он будет доступен как для чтения, так и для записи). Вызов метода getWritableDatabase() может завершиться неудачно из-за проблем с полномочиями или нехваткой места на диске, поэтому лучше предусмотреть откат к методу getReadableDatabase().

Если база данных не существует, вспомогательный класс вызывает свой обработчик onCreate(); если версия базы данных изменилась, вызовется обработчик onUpgrade(). В любом случае вызов методов getWritableDatabase/getReadableDatabase, в зависимости от ситуации, вернет существующую, только что созданную или обновленную базу данных.

Оба метода имеют разные названия, но возвращают один и тот же объект. Только метод для чтения getReadableDatabase() сначала проверит доступность на чтение/запись. В случае ошибки метод проверит доступность на чтение и только потом уже вызовет исключение. Второй метод сразу проверяет доступ к чтению/записи и вызывает исключение при отказе в доступе.

Если вы планируете использовать несколько таблиц, то рекомендуется создавать для каждой таблицы отдельный класс.

SQLiteDatabase

Для управления базой данных SQLite существует класс SQLiteDatabase. В классе SQLiteDatabase определены методы query(), insert(), delete() и update() для чтения, добавления, удаления, изменения данных. Кроме того, метод execSQL() позволяет выполнять любой допустимый код на языке SQL применимо к таблицам базы данных, если вы хотите провести эти (или любые другие) операции вручную.

Каждый раз, когда вы редактируете очередное значение из базы данных, нужно вызывать метод refreshQuery() для всех курсоров, которые имеют отношение к редактируемой таблице.

Для составления запроса используются два метода: rawQuery() и query(), а также класс SQLiteQueryBuilder.

Метод query()

Для чтения данных используют вызов метода query():

В метод query() передают семь параметров. Если какой-то параметр для запроса вас не интересует, то оставляете null:

Объект Cursor, возвращаемый методом query(), обеспечивает доступ к набору записей результирующей выборки. Для обработки возвращаемых данных объект Cursor имеет набор методов для чтения каждого типа данных — getString(), getInt() и getFloat().

Чтобы получить все записи из нужных столбцов без условий, достаточно указать имя таблицы в первом параметре и строчный массив во втором. В остальных параметрах оставляем null:

Для запроса с условием используются третий и четвёртый параметр. Например, нам нужны записи, у которого имя кота будет Барсик:

Множественные условия. Об этом говорилось выше.

Пример при использовании числовых значений, например, идентификатор первичного ключа (об этом тоже говорилось)

Возможна сортировка по нескольким столбцам.

Вы можете использовать функции SQL для составления запросов: AVG(), COUNT(), SUM(), MAX(), MIN() и др.

Ещё один абстрактный пример подсчёта средней суммы:

rawQuery()

Также существует метод rawQuery(), принимающий сырой SQL-запрос.

Метод insert()

Для вставки новой записи в базу данных SQLite используется метод insert():

В метод insert() необходимо передать три параметра:

Для создания новой строки понадобится объект ContentValues, точнее, его метод put(), чтобы обеспечить данными каждый столбец. Объект ContentValues представляет собой пару name/value данных. Вставьте новую строку, передавая в метод insert(), вызванный в контексте нужной нам базы данных, имя таблицы и объект ContentValues

Метод update()

Для обновления и удаления записей в базе данных используют соответственно методы update() и delete():

В этих методах два последних параметра формируют SQL-выражение WHERE аналогично рассмотренному методу query() для чтения данных. Эти методы возвращают число модифицированных или удаленных строк.

Обновление строк также происходит с помощью класса ContentValues. Создайте новый объект ContentValues, используя метод put() для вставки значений в каждый столбец, который вы хотите обновить. Вызовите метод update() в контексте базы данных, передайте ему имя таблицы, обновленный объект ContentValues и оператор WHERE, указывающий на строку (строки), которую нужно обновить.

Ещё пример с использованием выражения WHERE:

В первом параметре метода мы указываем имя таблицы, которую хотим обновить.

Во втором параметре мы указываем значение, которое хотим обновить. Например, в колонке «DESCRIPTION» нужно обновить значение на «Clever».

Обратите внимание, что последний параметр является массивом. Вы можете использовать множественные условия для запроса. Например, нам нужно обновить запись в таблице, используя сразу две колонки для составления условия.

Данный код соответствует выражению Where NAME = «Murzik» or DESCRIPTION = «Nice».

Для условий всегда используются строки, поэтому может понадобиться конвертация в некоторых случаях. Например, нужно использовать идентификатор таблицы со значением 1.

Если в последних двух параметрах использовать null, то будут обновлены все записи в таблице.

Метод delete()

Чтобы удалить строку, просто вызовите метод delete() в контексте базы данных, указав имя таблицы и оператор WHERE. В результате вы получите строки, которые хотите удалить:

Метод практически совпадает с методом update().

Удалим запись с условием WHERE NAME = «Murzik»

Кроме вышеперечисленных методов, в этом классе также определены различные методы для выполнения других общих задач управления базой данных.

Метод openOrCreateDatabase: Открытие и создание баз данных без использования SQLiteOpenHelper

Вы можете открывать и создавать базы данных без помощи класса SQLiteOpenHelper, используя метод openOrCreateDatabase(), принадлежащий объекту Context вашего приложения. Получите доступ к базе данных в два шага. Сначала вызовите метод openOrCreateDatabase(), чтобы создать новую базу данных. Затем из полученного экземпляра базы данных вызовите execSQL(), чтобы выполнять команды на языке SQL, с помощью которых будут созданы таблицы и установлены отношения между ними.

Контент-провайдеры

Контент-провайдеры поддерживают стандартный синтаксис запросов для чтения, изменения, вставки и удаления данных. Если необходимо предоставить доступ к своим данных для других приложений, существует два варианта:

Вставляем картинки в базу

Источник

Информ портал о технике и не только