Android — Android и база данных

Содержание

Программирование SQL базы данных в Android

По умолчанию в Android используется база данных SQLite — это довольно популярная, легкая и быстрая реляционная база данных. Если для вас SQL – это пустой звук, то, скорее всего, вы мало что поймете из этой статьи. Предполагается, что читатель знаком с SQL, знает что такое запросы выборки, триггеры и представления. Если это не так — почитайте какое-нибудь введение в SQL, а потом возвращайтесь сюда.

База данных SQLite имеет некоторые особенности, о которых нужно помнить:

  • Не поддерживается проверка типов данных. Это значит, что Вы случайно сможете записать данные не того типа, например поместить строку в колонку, предназначенную для целых чисел.
  • Не поддерживается ссылочная целостность: нет поддержки FOREIGN KEY и конструкций JOIN.
  • Полная поддержка Unicode отключена по умолчанию.

Давайте создадим простую базу данных, содержащую информацию о работниках. База содержит две таблицы: Employees — для хранения данных о сотрудниках и Dept — о департаментах. И представление ViewEmps, связывающее работников с департаментами.

Создание SQLite базы данных в Android проекте

По умолчанию, Android не содержит удобных СУБД для создания и работы с базами данных (есть sqlite3.exe — консоль для работы с базой данных), поэтому давайте создадим базу и все необходимые таблицы непосредственно из кода.

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

  • onCreate(SQLiteDatabase db) — вызывается при создании базы данных. Здесь мы можем создать таблицы, определить в них колонки, создать виды и триггеры.
  • onUpgrade(SQLiteDatabse db, int oldVersion, int newVersion) — вызывается, при внесении изменений в базу, например при создании и удалении таблиц

Внутри нашего класса определим переменные

Как видите, здесь мы просто вызываем конструктор суперкласса, который имеет четыре параметра:

  • Context— контекст, связанный с базой данных.
  • dataBaseName— имя базы данных.
  • CursorFactory— можно использовать класс, созданный на основе класса Cursor. Это позволяет проводить некоторые дополнительные проверки и операции с результатами запросов. Если сюда подставить ссылку на наш класс, он будет использоваться вместо стандартного курсора. Мы не будем работать с CursorFactory, поэтому передадим значение null.
  • Version— версия базы данных. Смысл этого параметра будет раскрыт ниже

Создание базы данных

Давайте переопределим методonCreate

Внутри метода мы с помощью SQL запросов создаем таблицы, триггеры и представления. Запросы вызываются для базы db с помощью методаexecSQL.

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

Изменение базы данных

Иногда возникает необходимость внести изменения в базу данных: поменять схему, добавить новые таблицы или поменять типы столбцов таблиц. Все это можно сделать внутри методаonUpdate(SQLiteDatabase db,int old Version,int newVerison) .

Этот метод вызывается, когда изменяется номер, указанный в конструкторе класса. Помните то загадочное число 33, внутри конструктораDatabaseHelper? Если Вам вдруг понадобится внести изменение в свою базу, просто поменяйте номер в конструкторе. То есть, если вы измените конструктор

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

Управление внешними ключами

Давайте создадим триггер, который будет следить при добавлении нового сотрудника за тем, чтобы указанный в описании сотрудника департамент присутствовал в таблице Dept.

SQL команда, создающая такой триггер, выглядит следующим образом:

Выполнение SQL команд в Android

Как уже было отмечено выше, Вы можете выполнить любую SQL команду с помощью мtтодаdb.execSQL(String statement).

Добавление записи в таблицу

Можно добавить новую запись в таблицу с помощью SQL командыINSERT, а можно воспользоваться методомdb.insert:

Обратите внимание, для соединения с базой данных мы вызвали методthis.getWritableDatabase(). КлассContentValuesпозволяет создать карту с параметрами ключ-значение. Эта карта затем используется методомinsert, который фактически добавляет запись в таблицу. МетодContentValues.put создает пару ключ-значение. Еще одно замечание, хорошим тоном считается закрывать базу данных вызовом метода close() после завершения выполнения группы команд.

Изменение значений в таблице

Изменить значение в какой-либо записи можно с помощью SQL командыUPDATEили с помощью метода db.update:

Метод update имеет следующие параметры:

  • String Table: название таблицы в которой мы хотим что-то изменить.
  • ContentValues cv: пара ключ-значение с новой информацией.
  • String where: строка-шаблон, определяющая условие WHERE, которое проверяется для каждой строки таблицы. Ксли условие истинно, то в этой строке обновляется информация в соответствии с параметром cv.
  • String[] args: массив с аргументами, которые подставляются в строку-шаблон where.

Удаление строк

Удалить строку в таблице можно с помощью SQL командыDELETE, а также с помощью методаdb.delete. Этот метод имеет аналогичный updateнабор параметров (за исключением cv).

Выполнение SQL запросов

Для выполнения запросов в Android используются два метода:db.rawQuery иdb.query. Давайте сделаем запрос к базе, с целью получения списка всех департаментов:

МетодrawQuery имеет два параметра:

  • String query: Строка с SQL запросом SELECT.
  • String[] selection args: массив аргументов where, если он используется в SELECT запросе.

Замечания! В качестве результата этого запроса возвращается объектCursor. Если в качестве ключевого поля в таблице используется колонка с именем, отличным от _id, Вам необходимо использовать alias в форме «SELECT [Column Name] as _id». Дело в том, что объектCursorвсегда считает, что ключевое поле имеет имя_id, и если это не так, генерируется исключение.

Другим способом выполнения запроса к базе является вызов методаdb.query. Давайте напишем метод, который выдает всех сотрудников, работающих в каком-то конкретном департаменте:

Методdb.query имеет следующий набор параметров:

  • String Table Name: Имя таблицы, из которой осуществляется выборка.
  • String [ ] columns: список столбцов, которые войдут в результат.
  • String WHERE clause: шаблон where-условия или null.
  • String [ ] selection args: массив с аргументами where-условия.
  • String Group by: условие группировки.
  • String Having: условие HAVING.
  • String Order By by: порядок сортировки.

Управление объектом Cursor

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

  • boolean moveToNext()— перемещает указатель на одну запись вперед. Возвращает false, если достигнут конец таблицы результата.
  • boolean moveToFirst()— перемещает указатель на первую строку. Возвращает false, если таблица-результат не содержит строк.
  • boolean moveToPosition(int position) — перемещает указатель на конкретную строку в таблице результатов. Если строки с таким номером нет — возвращает false.
  • boolean moveToPrevious()— перемещает указатель на одну запись назад. Возвращает false, если достигнуто начало таблицы результата.
  • boolean moveToLast()— перемещает указатель на последнюю строку. Возвращает false, если таблица-результат не содержит строк.
  • int getColumnIndex(String column)— возвращает ссылку на колонку column в текущей строке. Для получения значения по ссылке используются методыCursor.getInt(int ColumnIndex), getShort,getString,getDouble, getBlob.

Для определение текущей позиции указателя можно воспользоваться методами: boolean isAfterLast(), isBeforeFirst, isFirst, isLast и isNull(columnIndex). Их назначение без труда можно понять из названий.

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

В результате выполнения этого метода, мы получим значение колонки _id текущей строки. После использования курсора его хорошо бы закрыть с помощью методаclose().

Вот собственно и все. Теперь вы вполне сможете использовать базы данных в своих Android проектах.

Создание расписания уроков для андроид устройств. Часть 2. База данных SQLITE и фрагменты

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

В предыдущей версии информация поступала из строковых массивов, которые были созданы в файле String.xml, посредником между данными и приложением являлся Array Adapter, а сегодня сделаем загрузку из базы данных SQLite.

Она будет находиться в apk файле, вместе с самим приложением, так что никаких настроек или манипуляций не нужно будет делать. Установил, открыл — работает.

Кто не читал статью «Создание расписания уроков для андроид устройств. Array Adapter для фрагментов» переходите по ссылке, в ней вы сможете скачать файл проекта, который будем редактировать.

Создание базы данных в Excel

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

  • class — номер класса(11-6)
  • day — день недели(1-5)
  • urok_id- порядок уроков
  • urok — название предмета.

На втором листе книги напишем номер предмета и название, с помощью функции на первом листе в столбец urok введем формулу =СЛУЧМЕЖДУ(1;13) так как на втором листе 13 предметов, а в соседнюю ячейку =ВПР(D2,Лист2!A:B;2;0) для получения списка пердметов.

Использование DB Browser for SQLite

Затем скопируем как значения получившийся список на новый лист и сохраним его как CSV(разделитель — запятые).

Далее нам понадобится программа DB Browser for SQLite (я пользуюсь версией 3.5.1), в которой создадим новую базу данных(New Database), назавем ее 1.sqlite.

Нажмем File->Import->Table from CSV file. укажем путь к сохраненной ранее книге, присвоим название таблице myrasp, поставим галочку Column name in first line, кодировка Other — CP1251, разделитель «;» и нажмем Ok.

Модифицируем таблицу myrasp, нажав ПКМ, добавим новое поле(Add field) «_id» с типом text или integer, отметим галочками PK(первичный ключ) и AI(автоинкремент). Поле «_id» можно поднять выше в списке полей таблицы.

Цукерберг рекомендует:  Книги - Полезная литература для программиста.

Создание директории assets

Вернемся в Android Studio и создадим папку assets для хранения нашей базы данных SQLite, нажав в проекте ПКМ: New->Folder->Asset Folder. Если вы скопируете 1.sqlite то можно сразу в эту папку вставить файл, я же в Total Comander переименую в rasp.sqlite и скопирую в проект в папку assets. Когда мы перейдем в среду разработки Android Studio, то в папке будет видна наша база.

Изменения не коснутся файлов MainActivity.java и MainActivity11.java, будем использовать код из предыдущего проекта. В файле fragment_main11.java, отвечающем за отображение уроков понедельника уберем конструкцию switch(classId)<> целиком, удалим переменную ListAdapter adapter.

Класс DatabaseHelper.java для работы с базой данных

Создадим новый класс DatabaseHelper.java, он понадобится для связи с базой данных, открытия, чтения данных.

Данный код универсален для любых проектов, в настройках можно менять названия переменных DB_NAME, TABLE, COLUMN_.

Настройки таблицы

Напишем название базы данных и таблицы в переменные

Присвоим поля таблицы myrasp переменным

Хочу обратить ваше внимание на переменную DB_PATH, которую я для упрощения написал просто «/data/data/»+название пакета+»/database/». В моем случае название пакета — ru.maxfad.myraspisanie, у вас может и будет отличаться для других приложений.

Работа с фрагментами

Теперь откроем fragment_main11.java, в который добавим метод onCreateView

Поскольку нам нужно получить доступ к фрагменту из активности напишем функцию, в которой свяжемся со слоем фрагмента fragment_main11.xml, а в переменную mList получим ListView для отображения уроков

Во fragment_main11.xml удалим секцию разметки TextView и переименуем id ListView

Добавим переменные для работы с базой данных

В метод onActivityCreate напишем новый экземпляр класса DatabaseHelper и создадим базу данных

Напишем метод onResume в котором и будет происходить выборка данных из таблицы myrasp, выполняться SQL запрос и формироваться список уроков

Как вы можете обратить внимание, в строке » and day=1″ и заключается принцип загрузки данных по дням недели, в остальных фрагментах код будет отличаться только номером дня.

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

Архив с кодом проекта можно скачать по ссылке ниже, обязательно посмотрите видеоролик по материалам статьи, в нем есть БОНУС: на примере этого приложения я покажу, как работать в Android Studio с макетом с помощью BluePrint+Design.

А на сегодня все, делитесь этой статьей в соцсетях и подписывайтесь на канал YouTube.

Cкачать архив для ознакомления — проект Расписание для уроков:

Создание расписания уроков для андроид устройств. Часть 2. База данных SQLITE и фрагменты + БОНУС :

Рекомендуем смотреть видео в полноэкранном режиме, в настойках качества выбирайте 1080 HD, не забывайте подписываться на канал в YouTube, там Вы найдете много интересного видео, которое выходит достаточно часто. Приятного просмотра!

Полный список

— хранение данных с помощью SQLite

На прошлом уроке мы рассмотрели самый простой способ хранения данных — Preferences. Но способ этот достаточно ограничен и для хранения большого количества структурированных данных неудобен. На этом уроке рассмотрим SQLite. Это база данных с таблицами и запросами — все как в обычных БД.

Для начала, немного теории по взаимодействию приложения и БД.

В приложении, при подключении к БД мы указываем имя БД и версию. При этом могут возникнуть следующие ситуации:

1) БД не существует. Это может быть например в случае первичной установки программы. В этом случае приложение должно само создать БД и все таблицы в ней. И далее оно уже работает с только что созданной БД.

2) БД существует, но ее версия устарела. Это может быть в случае обновления программы. Например новой версии программы нужны дополнительные поля в старых таблицах или новые таблицы. В этом случае приложение должно апдейтить существующие таблицы и создать новые, если это необходимо.

3) БД существует и ее версия актуальна. В этом случае приложение успешно подключается к БД и работает.

Как вы понимаете, фраза «приложение должно» равнозначна фразе «разработчик должен», т.е. это наша задача. Для обработки описанных выше ситуаций нам надо создать класс, являющийся наследником для SQLiteOpenHelper. Назовем его DBHelper. Этот класс предоставит нам методы для создания или обновления БД в случаях ее отсутствия или устаревания.

onCreate — метод, который будет вызван, если БД, к которой мы хотим подключиться – не существует

onUpgrade — будет вызван в случае, если мы пытаемся подключиться к БД более новой версии, чем существующая

Давайте накидаем простое приложение – справочник контактов, которое будет хранить имя и email. Вводить данные будем на экране приложения, а для отображения информации используем логи. Обычно для этого используется List (список) – но мы эту тему пока не знаем. Да и не хочется перегружать приложение. Главное – освоить приемы работы с БД.

Project name: P0341_SimpleSQLite
Build Target: Android 2.3.3
Application name: SimpleSQLite
Package name: ru.startandroid.develop.p0341simplesqlite
Create Activity: MainActivity

Нарисуем экран для ввода записей и очистки таблицы. Открываем main.xml и пишем:

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

Открываем MainActivity.java и пишем:

Куча новых незнакомых слов в коде. Давайте разбираться.

В методе Activity — onCreate мы определяем объекты, присваиваем обработчики и создаем объект dbHelper класса DBHelper для управления БД. Сам класс будет описан ниже.

Далее смотрим метод Activity – onClick, в котором мы обрабатываем нажатия на кнопки.

Класс ContentValues используется для указания полей таблицы и значений, которые мы в эти поля будем вставлять. Мы создаем объект cv, и позже его используем. Далее мы записываем в переменные значения из полей ввода. Затем, с помощью метода getWritableDatabase подключаемся к БД и получаем объект SQLiteDatabase. Он позволит нам работать с БД. Мы будем использовать его методы insert – вставка записи, query – чтение, delete – удаление. У них много разных параметров на вход, но мы пока используем самый минимум.

Далее смотрим, какая кнопка была нажата:

btnAdd – добавление записи в таблицу mytable. Мы заполняем объект cv парами: имя поля и значение. И (при вставке записи в таблицу) в указанные поля будут вставлены соответствующие значения. Мы заполняем поля name и email. id у нас заполнится автоматически (primary key autoincrement). Вызываем метод insert – передаем ему имя таблицы и объект cv с вставляемыми значениями. Второй аргумент метода используется, при вставке в таблицу пустой строки. Нам это сейчас не нужно, поэтому передаем null. Метод insert возвращает ID вставленной строки, мы его сохраняем в rowID и выводим в лог.

btnRead – чтение всех записей из таблицы mytable. Для чтения используется метод query. На вход ему подается имя таблицы, список запрашиваемых полей, условия выборки, группировка, сортировка. Т.к. нам нужны все данные во всех полях без сортировок и группировок — мы используем везде null. Только имя таблицы указываем. Метод возвращает нам объект класса Cursor. Его можно рассматривать как таблицу с данными. Метод moveToFirst – делает первую запись в Cursor активной и заодно проверяет, есть ли вообще записи в нем (т.е. выбралось ли что-либо в методе query). Далее мы получаем порядковые номера столбцов в Cursor по их именам с помощью метода getColumnIndex. Эти номера потом используем для чтения данных в методах getInt и getString и выводим данные в лог. С помощью метода moveToNext мы перебираем все строки в Cursor пока не добираемся до последней. Если же записей не было, то выводим в лог соответствующее сообщение – 0 rows. В конце закрываем курсор (освобождаем занимаемые им ресурсы) методом close, т.к. далее мы его нигде не используем.

btnClear – очистка таблицы. Метод delete удаляет записи. На вход передаем имя таблицы и null в качестве условий для удаления, а значит удалится все. Метод возвращает кол-во удаленных записей.

После этого закрываем соединение с БД методом close.

Класс DBHelper является вложенным в MainActivity и описан в конце кода. Как я уже писал выше, этот класс должен наследовать класс SQLiteOpenHelper.

В конструкторе мы вызываем конструктор суперкласса и передаем ему:
context — контекст
mydb — название базы данных
null – объект для работы с курсорами, нам пока не нужен, поэтому null
1 – версия базы данных

В методе onCreate этого класса мы используем метод execSQL объекта SQLiteDatabase для выполнения SQL-запроса, который создает таблицу. Напомню – этот метод вызывается, если БД не существует и ее надо создавать. По запросу видно, что мы создаем таблицу mytable с полями id, name и email.

Метод onUpgrade пока не заполняем, т.к. используем одну версию БД и менять ее не планируем.

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

Введем чего-нить в поля ввода и нажмем Add.

— onCreate database —
— Insert in mytable: —
row inserted, >

Мы видим, что вызывался метод onCreate в классе DBHelper, а значит выполнялся скрипт по созданию таблицы. Это произошло потому, что это первый запуск приложения и БД еще не была создана. Теперь БД существует и с ней можно работать.

Далее видим, что вызывался метод вставки записи и вернул >

Вставим еще какую-нибудь запись.

— Insert in mytable: —
row inserted, >

На этот раз onCreate не вызывался, т.к. БД уже существует. Вставилась запись с >

Давайте посмотрим содержимое таблицы — нажмем кнопку Read и посмотрим лог:

— Rows in mytable: —
>Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.
>Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.

Мы видим записи, которые вставляли. Тут все верно.

Теперь очистим таблицу — нажмем Clear. Смотрим лог:

— Clear mytable: —
deleted rows count = 2

Удалено две записи, все верно. Если теперь посмотрим содержимое таблицы – кнопка Read:

— Rows in mytable: —
0 rows

В этой теме важно понять, что для работы с БД мы использовали два класса:

DBHelper, наследующий SQLiteOpenHelper. В его конструкторе мы вызываем конструктор супер-класса и указываем имя и версию БД. Метод getWritableDatabase выполняет подключение к базе данных и возвращает нам объект SQLiteDatabase для работы с ней. Метод close закрывает подключение к БД. В случае, когда БД отсутствует или устарела, класс предоставляет нам самим реализовать создание или обновление в методах onCreate и onUpgrate.

SQLiteDatabase. Содержит методы для работы с данными – т.е. вставка, обновление, удаление и чтение.

Файл базы можно найти в File Explorer, как и на прошлом уроке. Путь к нему data/data/ru.startandroid.develop.p0341simpelsqlite/databases/myDB.

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

Важное замечание

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

На следующем уроке:

— используем методы query и delete с указанием условия

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Android. Работа с базой данных SQLite

В данном уроке мы рассмотрим как можно взаимодействовать с базой данных в Andro >

Android предоставляет несколько способов для хранения пользовательских данных и приложений. SQLite является одним из способов хранения данных пользователя. SQLite это очень легковестная база данных, которая содержится в ОС Android.

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

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

Шаг 1.

Начнем реализацию с класса DatabaseHandler, но для начала создадим для этого класса интерфейс:

Описание методов:

void addContact(Contact contact) – позволяет сохранять в базу данных новые контакты пользователей;
Contact getContact(int id) – позволяет получить контакты по id;
List getAllContacts() – позволяет получить все контакты с БД;
int getContactsCount() – позволяет получить количество контактов находящиеся в БД;
int updateContact(Contact contact) – позволяет обновить контакт;
void deleteContact(Contact contact) – позволяет удалить контакт;
void deleteAll() – позволяет удалить все контакты.

Теперь нужно реализовать этот интерфейс, но для начала унаследуемся от SQLiteOpenHelper .

Полный класс выглядит так:

По названиям переменных класса можно понять зачем они по этому перейду к методам класса.

В конструкторе мы вызываем конструктор предка и передаем название БД, а также версию.

Этот метод будет создавать таблицу в БД.

Этот метод пересоздаст таблицу в БД.

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

В 3-й строчке примера выше используется экземпляр класса который позволяет нам получать доступ к БД.

4-я строчка используется ContentValues этот класс содержит данные которые нужно записать в БД в виде Map которая принимает два параметра ключ, значение с помощью метода put(key, value).

Ну и 8-я строка добавляет в запись в БД и следующей строкой закрывает соединение с БД.

Работа с готовой базой данных SQLite под Andro > 01.11.2020 Admin Комментировать

В предыдущей статье посвящённой работе с SQLite в Android приложениях на Java была рассмотрена, если её можно так назвать, «классическая» схема. Когда создаётся пустая база данных, которая впоследствии заполняется в коде программы.

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

Способ использования готовой базы данных приведённый в данной статье является универсальным и не требует каких-либо сторонних библиотек и т.д., так как реализован на «чистом» Android SDK.

Важное замечание!

Если вы ранее не работали с SQLite под Android средствами Java, настоятельно рекомендуется вначале ознакомиться со статьёй «Работа с СУБД SQLite под Android на Java», где помимо упомянутой «классической» схемы подробно описаны основы работы с данной СУБД.

Создание базы данных

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

При создании базы данных необходимо учитывать один нюанс.

В Android в базе данных SQLite должна обязательно присутствовать специальная таблица android_metadata. Эта таблица создаётся непосредственно Android и используется в служебных целях.

При работе с базой данных по «классической» схеме, данная таблица создаётся автоматически без участия разработчика. Если же речь идёт об использовании уже готовой базы данных, таблицу android_metadata необходимо создать самостоятельно.

Таблица android_metadata содержит одно единственное поле locale, которое имеет тип данных текст и значение по умолчанию «en_US».

Android programmers blog

Simply about difficult

Поиск по этому блогу

четверг, 31 января 2013 г.

Работа с базой данных Andro >

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

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

Статья рассчитана на тех кто имеет хоть малейшее понятия что такое базы данных и хотя бы раз работал с любой из существующих баз, если же таковых знаний и умений нет то рекомендую хабрахабр для чтения этих статей их там полно. Конкретной статьи не посоветую так как сам с базами больше 4 лет уже работаю, учился не по статьям, а по методу тыка (: Так вот и научился.

Собственно ниже я начинаю рассказывать как сделать красивейшую базу с блекджеком и кхмм… печеньками.
У нас будет 3 активности которые будут содержать три разных типа контента. Первая будет у нас главной в ней мы будем вводить данные, во второй мы будем смотреть в списке что мы вводили и третья активность эта та в которой мы будем смотреть более подробные данные о выбранном поле в списке.

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

Начнем мы с того что создадим три файла для создания базы данных. Ихний код с комментариями ниже:

Для начала класс создания базы данных.

В этом классе мы создаем базу которую дальше мы будем использовать. Собственно больше нечего сказать.

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

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

Собстно ничего трудного как по мне еще не было, все функции однотипные, я кстати привел два примера для запросов первый пример это в методах update() и write(), а второй пример это метод delete(), если обратите внимание то там в последнем я использую готовую функцию для удаления, андроиде есть уже готовые функции которые можно использовать подставив только свои нужные параметры, скажу очень удобно.

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

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

Код разметки для MainActivity:

Дальше мы создадим нашу активность со списком. Её код ниже:

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

Ниже я выложу три вьюшки, они нам понадобятся сохраните их у себя в res/layout по ходу дела разберетесь зачем они.

Эта разметка для нашего ListActivity.java.

Эта вьюшка нам понадобится для вывода нашего списка в LisActivity.

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

Теперь можем расслабиться и получать удовольствие, у нас осталось одна активность которая требует что бы её создали и все, конец (: База данных будет готова. Эта активность которая показывается после короткого нажатия на выбраное поле в списке с фамилиями.

Делаем все то же, все так же, открыли базу для записи запилили прочитали вывели закрыли (:

Код нашей разметки в активности будет вот такой.

Два текстовых поля которые выводят нашу красату.

Вот и все, база готова, осталось только прописать активности в манифесте и все будет зашибись.

Подключение существующей БД SQLite в Andro >Обучающий пример работы с БД SQLite, которая была заранее подготовлена.

10.04.2020 23 комментария 29 014 просмотров

Пример простого Andro >

Содержание

Введение

Есть два подхода к работе с БД в Android приложениях.

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

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

Создание базы данных

Для создания БД SQLite будем использовать, например, DB Browser for SQLite. Скачиваем и устанавливаем.

Буем создавать БД с одной таблицей такого вида.

_id name age
1 Anton 30
2 Alina 24
3 Dima 28
4 Dasha 23

Итак, создаем базу данных.

Где-нибудь сохраняем и называем, например, info.db .

Создаем таблицу, например, clients . И добавляем там поле.

Первым полем у нас будет номер записи _id . Поле будет также первичным ключом.

Аналогичным способом создаем поля age и name . И жмем OK .

В списке таблиц у нас появилась наша таблица clients .

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

Выбираем там нашу таблицу и жмем Добавить запись .

Заполняем наши данные и сохраняем изменения в БД.

Создание Android проекта

Открываем Android Studio и создаем там новый проект с пустой активностью. Всё как обычно.

Разметка активности

Так как мы создаем простейшее приложение, но в xml файле активности разместим только кнопку и поле для вывода текста.

Подготовка Java кода

Нам потребуется обработать клик на кнопку button и что-то записать в textView .

Поэтому найдем данные компоненты и свяжем их в java коде с xml.

Объявим переменные компонентов.

Найдем компоненты в XML разметке.

Пропишем обработчик клика кнопки.

Полный код java файла.

Добавление БД в проект

Все приготовления сделаны. Теперь можем начать работать по теме статьи. Вначале добавим файл базы данных в проект.

Создадим папку assets в нашем проекте.

Скопируем файл нашей базы данных.

Добавление класса для работы с БД

Для открытия и подготовки БД в Andro >SQLiteOpenHelper . Мы тоже создадим наследник этого класса DatabaseHelper , но он будет сильно модифицированный, так как мы будем работать с готовой базой данных, а не создавать ей с помощью SQL запросов.

Ниже приведен текст всего класса, который нужно просто скопировать.

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

Разберем что означают эти строчки.

DB_NAME — имя файла БД. Какой файл БД вы создали, такое название сюда и копируем.

DB_PATH — путь к БД. Каждое приложение в Android имеет свою область памяти, куда складываются файлы программы. Вдруг вы захотите вывернуть путь к файлу БД. Я бы ничего не трогал.

DB_VERSION — самая интересная переменная (причем в примерах в сети по работе с готовой БД её обходят стороной). Это номер версии БД. Ниже описан принцип работы данного класса. Например, вы пишите справочник рецептов под Android и рецепты храните в БД. В момент создания установки приложения программа должна скопировать БД на устройство. Потом через какое-то время вы решили обновить приложение, и БД у вас обновилась: структура БД поменялась, добавились новые рецепты. И вам нужно заменить старую БД на новую. Вот тут вы и пропишите в данной переменной новую версию БД. И при открытии приложения будет произведена проверки версии БД и файл БД обновится. Вначале версия БД равна 1.

Итак, логика работы класса DatabaseHelper в подготовке базы данных.

Копируем файл БД, если этого файла нет (при установке приложения).

Если номер БД обновлен, то заменяем один файл базы данных на другой.

После работы с базой данных из данного класса вытаскиваем экземпляр SQLiteDatabase , с которым будем работать в дальнейшем: осуществлять запросы и так далее.

Подключаемся к БД

Перейдем в класс нашей активности. В нем создадим экземпляр класса DatabaseHelper , попытаемся обновить БД, если это требуется, а потом вытащим экземпляр SQLiteDatabase .

Использование базы данных с приложением Andro >

Представлено: Alexey Kostadinov, опубликовано: 12 августа 2014 г.

Аннотация

В мобильных приложениях в ряде случаев может быть полезно использование простой внутренней базы данных, такой как SQLite. В этой статье мы рассматриваем API Android* SQLite и вспомогательные классы для создания и обслуживания баз данных. Мы обсудим создание и использование заранее заполненной базы данных, а также будем использовать SQLite для создания внутренней базы данных для образца ресторанного приложения.

Содержание

Обзор

В 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. Подробные сведения см. в следующем фрагменте кода.

Фрагмент кода 1. Использование заранее заполненной базы данных ++

Доступ к элементам меню из базы данных ресторана

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

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

Фрагмент кода 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*, проводятся на определенных компьютерных системах, компонентах, программах, операциях и функциях. Любые изменения любого из этих элементов могут привести к изменению результатов. При выборе приобретаемых продуктов следует обращаться к другой информации и тестам производительности, в том числе к тестам производительности определенного продукта в сочетании с другими продуктами.

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

Andro >09.06.2014, 00:11. Просмотров 8450. Ответов 4

09.06.2014, 00:11

Вывод данных из базы данных SQLite
Здравствуйте уважаемые форумчане! Делаю программу для работы с базой данных SQLite. Смысл простой.

Создание базы данных в Android
Помогите пожалуйста! Я только-только начинаю изучать программирование на андроид. Хочу взяться за.

Android базы данных SQLite, Реализация MVC
Всем привет, такой вопрос, я подключаю базу к андроид проекту и беру информацию из базы каждый раз.

Как извлечь записи из базы данных Oracle в android
Сделал логирование, регистрацию, добавление в базу. Осталось только извлекать с сервера на клиент.

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

AwesomeDevelop

Лёгкая техносферная обстановка в душевой Google 8)

Собственная база данных на Andro > Unknown 23:52 android , android studio , androidstudio , development , snippet Edit

Скорее всего вы уже находили множество примеров создания собственной базы данных, которые являются копированием друг-друга и преимущественное большинство которых просто не обновляются. Потому я решил выложить пример использование заранее созданной БД, с простой реализацией обновления данных.

Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих