Афоризм
Большому кораблю – большие в трюме крысы.
Наталья Резник
Последние статьи

 • Активности Android
Многоэкранные Android приложения
 • Fragment dynamic
Динамическая загрузка фрагментов в Android
 • Fragment lifecycle
Жизненный цикл Fragment'ов в Android
 • Fragment example
Пример Fragment'ов в Android
 • Data Binding
Описание и пример Data Binding
 • Пример MVVM
Пример использования MVVM в Android
 • Компонент TreeTable
Описание компонента TreeTable для Swing
 • Пример TreeTable
Пример использования TreeTable
 • Хранилища Android
Внутренние и внешние хранилища данных
 • Пример SQLite
Пример использования SQLite в Android
 • WebSocket
Описание и пример реализации WebSocket
 • Визуальные компоненты
Улучшен компонент выбора даты из календаря
 • Анимация jQuery
Описание и примеры анимации элементов DOM
 • APK-файл Android
Создание apk-файла для android устройств, .dex файлы
 • платформа JaBricks
Платформа OSGi-приложения JaBricks
Поддержка проекта

Если Вам сайт понравился и помог, то будем признательны за Ваш «посильный» вклад в его поддержку и развитие
 • Yandex.Деньги
  410013796724260

 • Webmoney
  R335386147728
  Z369087728698
Вернуться к описанию Хранение данных и файлов в Android

БД SQLite в Android

Приложение Android может использовать базу данных SQLite для хранения больших объемов структурированных данных. SQLite — это лёгкая и очень быстрая система управления реляционными базами данных; это проект с открытыми исходными кодами, поддерживающий стандартные возможности обычного SQL (Structured Query Language).

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

Методы управления БД SQLite

Ниже представлены методы взаимодействия приложения Android с базой данных SQLite. Пример использования SQLite в приложении Android рассмотрен здесь. В примере создается база данных, таблица, записи таблицы, а также удаляются записи таблицы, сама таблица и БД.

При открытии БД, либо при создании с одновременным открытием методы возвращают объект типа SQLiteDatabase. Ниже в свернутом виде представлены методы создания и открытия БД.

Методы создания и открытия БД

// Методы открытия БД
SQLiteDatabase openDatabase (path, factory, flags);
SQLiteDatabase openDatabase (file, openParams    );
SQLiteDatabase openDatabase (path, factory, flags,
                                     errorHandler);
//---------------------------------------------------------
//----- Методы создания БД с одновременным открытием ------
/*
 * Equivalent to openDatabase(fpath, factory, 
 *                                   CREATE_IF_NECESSARY);
 */
SQLiteDatabase openOrCreateDatabase(file, factory);

/*
 * Equivalent to openDatabase(path, factory, 
 *                                  CREATE_IF_NECESSARY, 
 *                                  errorHandler);
 */
SQLiteDatabase openOrCreateDatabase(path, factory, 
                                          errorHandler);

/*
 * Equivalent to openDatabase(path, factory, 
 *                                  CREATE_IF_NECESSARY)
 */
SQLiteDatabase openOrCreateDatabase(path, factory);
 

В этих методах используются следующие параметры :

  • path : String, путь к БД для открытия и/или создания. Не может быть null;
  • factory : SQLiteDatabase.CursorFactory, опциональный параметр/класс для использования курсора. Может быть null;
  • flags : int, флаг доступа/управления, может быть 0 или комбинацией из :
    • OPEN_READWRITE;
    • OPEN_READONLY;
    • CREATE_IF_NECESSARY;
    • NO_LOCALIZED_COLLATORS;

Методы создания БД с открытием эквивалентны методам открытия БД с флагом CREATE_IF_NECESSARY.

Удаление БД

При удалении БД (файла базы данных) удаляется также и журнал протоколирования. Для удаления БД используется метод deleteDatabase объекта SQLiteDatabase :


static boolean deleteDatabase(File file);
 

Метод execSQL

Методом execSQL можно выполнить SQL-запрос, который не возвращает значений. Данный метод можно использовать для создания таблиц БД. При использовании execSQL для выполнения транзакций INSERT/UPDATE/DELETE результат выполнения будет неизвестен.

void execSQL(String sql);
void execSQL(String sql, Object[] bindArgs);

// Выполнение SQL-запрос во всех соединениях с БД
void execPerConnectionSQL(String sql, Object[] bindArgs);

Пример создания таблицы БД и проверка наличия в БД созданной таблицы.


SQLiteDatabase  db;

// Наименование БД
String DB_NAME = "dbAPP";

// SQL-скрипт создания таблицы БД
String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS users( "
                    +          "name      varchar(128),  "
                    +          "position  varchar (64),  "
                    +          "phone     varchar (16))";

// SQL-скрипт проверки наличия таблицы
String TABLE_CHECK  = "select DISTINCT tbl_name "
                    +      "from sqlite_master "
                    +        "where tbl_name = '%s'";

// Создание БД с открытием
db = openOrCreateDatabase(DB_NAME, MODE_PRIVATE, null);

// Создание таблицы БД
myDB.execSQL(CREATE_TABLE);

// Проверка наличия таблицы
Cursor  cursor = db.rawQuery(TABLE_CHECK, null);
boolean exists = cursor.getCount() > 0;

Log.d("SQL", "Таблица существует : " + exists);
 

Для проверки наличия таблицы в БД используется курсор android.database.Cursor, к рассмотрению которого мы и переходим.

Извлечение информации с помощью android.database.Cursor

При выполнении запросов типа SELECT сервер SQL возвращает набор записей. Для чтения одной или нескольких записей необходимо иметь некоторый указатель (pointer), которым определять требуемую для чтения запись. Таким указателем, позволяющим выбирать в наборе запись, является android.database.Cursor, который имеет соответствующие методы для перемещения по набору. Кроме этого, Cursor включает методы, для получения разнотипных значений в полях записей.

Методы android.database.Cursor

Метод Описание
Методы определения позиции курсора
int getPosition() Получение текущей позиции курсора в наборе.
boolean isAfterLast() Проверка положения курсора за последней записью в наборе.
boolean isBeforeFirst() Проверка положения курсора перед первой записью в наборе.
boolean isFirst() Проверка положения курсора в первой записи в наборе.
boolean isLast() Проверка положения курсора в последней записи в наборе
boolean move(int offset) Переместить курсор на несколько (offset) позиций вперед или назад относительно текущей.
boolean moveToFirst() Поместить курсор в первую позицию.
boolean moveToLast() Поместить курсор в последнюю позицию.
boolean moveToNext() Поместить курсор в следующую позицию.
boolean moveToPosition(int position) Поместить курсор в определенную позицию.
boolean moveToPrevious() Поместить курсор в предыдущую позицию.
Методы чтения значений
boolean isNull(int columnIndex) Проверка null-значения в поле записи.
byte[] getBlob(int columnIndex) Получить значение поля BLOB в виде массива byte.
double getDouble(int columnIndex) Получить значение поля double.
float getFloat(int columnIndex) Получить значение поля float.
int getInt(int columnIndex) Получить значение поля int.
long getLong(int columnIndex) Получить значение поля long.
short getShort(int columnIndex) Получить значение поля short.
String getString(int columnIndex) Получить значение поля String.
void copyStringToBuffer(int columnIndex,
           CharArrayBuffer buffer)
Текстовое значение поля записать в буффер переменную метода.
Дополнительные методы курсора
void close() Закрыть курсор и освободить все связанные с ним ресурсы.
int getColumnCount() Получение количества колонок.
int getColumnIndex(String columnName) Получить порядковый номер колонки по имени, отсчет от 0; -1 при отсутствии колонки.
int getColumnIndexOrThrow(String columnName) Получить порядковый номер колонки по имени, или throws IllegalArgumentException, если колонки нет.
String getColumnName(int columnIndex) Получить наименование колонки по индексу, отсчет от 0.
String[] getColumnNames() Получить массив наименований колонок.
int getCount() Получить количество строк в курсоре.
boolean isClosed() Проверка закрытого состояния курсора : return true, если курсор is closed.

Добавление, обновление и удаление записей

Для выполнения транзакций, связанных с выполнением insert/update/delete, можно использовать метод execSQL(sql) объекта SQLiteDatabase с точным определением выполняемого sql-выражения. Но лучше использовать методы insert/update/delete объекта SQLiteDatabase. Данные методы имеют преимущество - в случае insert/update они возвращают идентификатор _id измененной записи, подтверждающий успешность выполнения операции, или -1 в случае неудачного завершения транзакции. В случае удаления одной или нескольких записей методом delete возвращается значение, соответствующее количеству затронутых записей, или -1.

Для выполнения транзакций insert/update необходимо в качестве параметра использовать объект android.content.ContentValues, который определяет отдельную запись в таблице из набора полей. Конструкторы объекта ContentValues :

public ContentValues();
public ContentValues(int size);
public ContentValues(ContentValues from);
 

Пример добавления записи.


ContentValues record = new ContentValues();

record.put("name"    , "Остап Бендер"     );
record.put("position", "Менеджер"         );
record.put("phone"   , "+7(999) 888-77-66");

long rc = db.insert(TABLE_NAME, null, record);
Log.d(LOG_TAG, "rc = " + rc);
 

Методы ContentValues

Метод Описание
Методы определения позиции курсора
void clear() Удаление всех значений.
boolean containsKey(String key) Проверка наличия значения для поля key.
Object get(String key) Получить значение типа Object для поля key.
Boolean getAsBoolean(String key) Получить значение типа Boolean для поля key.
Byte getAsByte(String key) Получить значение типа Byte для поля key.
byte[] getAsByteArray(String key) Получить значение типа byte[] для поля key.
Double getAsDouble(String key) Получить значение типа Double для поля key.
Float getAsFloat(String key) Получить значение типа Float для поля key.
Integer getAsInteger(String key) Получить значение типа Integer для поля key.
Long getAsLong(String key) Получить значение типа Long для поля key.
Short getAsShort(String key) Получить значение типа Short для поля key.
String getAsString(String key) Получить значение типа String для поля key.
boolean isEmpty() Проверка, является ли набор «пустым».
Set<String> keySet() Получить коллекцию всех ключей из набора.
void put(String key, Short value) Добавить в набор значение типа Short с ключом/полем key.
void put(String key, Long value) Добавить в набор значение типа Long с ключом/полем key.
void put(String key, Double value) Добавить в набор значение типа Double с ключом/полем key.
void put(String key, Integer value) Добавить в набор значение типа Integer с ключом/полем key.
void put(String key, String value) Добавить в набор значение типа String с ключом/полем key.
void put(String key, Boolean value) Добавить в набор значение типа Boolean с ключом/полем key.
void put(String key, Float value) Добавить в набор значение типа Float с ключом/полем key.
void put(String key, Byte value) Добавить в набор значение типа Byte с ключом/полем key.
void put(String key, byte[] value) Добавить в набор значение типа byte[] с ключом/полем key.
void putAll(ContentValues other) Добавить все значения из другого набора.
void putNull(String key) Определить значение NULL для поля с ключом key.
void remove(String key) Удалить из набора значение для поля с ключом key.
Set<Entry<String, Object>> valueSet() Получить набор значений с ключами.

Пример использования SQLite в Android рассмотрен здесь.

  Рейтинг@Mail.ru