Android sqlite and content

Android — SQLite Database

SQLite is a opensource SQL database that stores data to a text file on a device. Android comes in with built in SQLite database implementation.

SQLite supports all the relational database features. In order to access this database, you don’t need to establish any kind of connections for it like JDBC,ODBC e.t.c

Database — Package

The main package is android.database.sqlite that contains the classes to manage your own databases

Database — Creation

In order to create a database you just need to call this method openOrCreateDatabase with your database name and mode as a parameter. It returns an instance of SQLite database which you have to receive in your own object.Its syntax is given below

Apart from this , there are other functions available in the database package , that does this job. They are listed below

openDatabase(String path, SQLiteDatabase.CursorFactory factory, int flags, DatabaseErrorHandler errorHandler)

This method only opens the existing database with the appropriate flag mode. The common flags mode could be OPEN_READWRITE OPEN_READONLY

openDatabase(String path, SQLiteDatabase.CursorFactory factory, int flags)

It is similar to the above method as it also opens the existing database but it does not define any handler to handle the errors of databases

openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory)

It not only opens but create the database if it not exists. This method is equivalent to openDatabase method.

openOrCreateDatabase(File file, SQLiteDatabase.CursorFactory factory)

This method is similar to above method but it takes the File object as a path rather then a string. It is equivalent to file.getPath()

Database — Insertion

we can create table or insert data into table using execSQL method defined in SQLiteDatabase class. Its syntax is given below

This will insert some values into our table in our database. Another method that also does the same job but take some additional parameter is given below

Sr.No Method & Description
1

execSQL(String sql, Object[] bindArgs)

This method not only insert data , but also used to update or modify already existing data in database using bind arguments

Database — Fetching

We can retrieve anything from database using an object of the Cursor class. We will call a method of this class called rawQuery and it will return a resultset with the cursor pointing to the table. We can move the cursor forward and retrieve the data.

There are other functions available in the Cursor class that allows us to effectively retrieve the data. That includes

Sr.No Method & Description
1

This method return the total number of columns of the table.

This method returns the index number of a column by specifying the name of the column

This method returns the name of the column by specifying the index of the column

This method returns the array of all the column names of the table.

This method returns the total number of rows in the cursor

This method returns the current position of the cursor in the table

This method returns true if the cursor is closed and return false otherwise

Database — Helper class

For managing all the operations related to the database , an helper class has been given and is called SQLiteOpenHelper. It automatically manages the creation and update of the database. Its syntax is given below

Example

Here is an example demonstrating the use of SQLite Database. It creates a basic contacts applications that allows insertion, deletion and modification of contacts.

To experiment with this example, you need to run this on an actual device on which camera is supported.

Sr.No Method & Description
1
Steps Description
1 You will use Android studio to create an Android application under a package com.example.sairamkrishna.myapplication.
2 Modify src/MainActivity.java file to get references of all the XML components and populate the contacts on listView.
3 Create new src/DBHelper.java that will manage the database work
4 Create a new Activity as DisplayContact.java that will display the contact on the screen
5 Modify the res/layout/activity_main to add respective XML components
6 Modify the res/layout/activity_display_contact.xml to add respective XML components
7 Modify the res/values/string.xml to add necessary string components
8 Modify the res/menu/display_contact.xml to add necessary menu components
9 Create a new menu as res/menu/mainmenu.xml to add the insert contact option
10 Run the application and choose a running android device and install the application on it and verify the results.

Following is the content of the modified MainActivity.java.

Following is the modified content of display contact activity DisplayContact.java

Following is the content of Database class DBHelper.java

Following is the content of the res/layout/activity_main.xml

Following is the content of the res/layout/activity_display_contact.xml

Following is the content of the res/value/string.xml

Following is the content of the res/menu/main_menu.xml

Following is the content of the res/menu/display_contact.xml

This is the defualt AndroidManifest.xml of this project

Let’s try to run your application. I assume you have connected your actual Android Mobile device with your computer. To run the app from Android studio , open one of your project’s activity files and click Run icon from the tool bar. Before starting your application,Android studio will display following window to select an option where you want to run your Android application.

Select your mobile device as an option and then check your mobile device which will display following screen −

Now open your optional menu, it will show as below image: Optional menu appears different places on different versions

Click on the add button of the menu screen to add a new contact. It will display the following screen −

It will display the following fields. Please enter the required information and click on save contact. It will bring you back to main screen.

Источник

Кошкин дом. Контент-провайдер. Часть третья

Во второй части мы использовали SQLite. Переделаем пример с использованием контент-провайдера.

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

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

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

При работе с контент-провайдером вы увидите, что многие методы дублируются. Так же как и с SQLite вам нужно реализовать методы query(), insert(), update(), delete().

Создание контент-провайдера

В пакете data создаём новый класс GuestProvider на основе ContentProvider. Студия предложит добавить обязательные методы.

Далее пишется очень много кода.

Главное — у провайдера есть основые методы: onCreate(), query(), insert(), update(), delete(), getType(). Часть есть методов выполняют ту же задачу, что и одноимённые методы в SQLiteDatabase.

В методе query() формируется запрос в зависимости от того, что мы хотим получить — информацию о всей таблице или только об одном ряде через switch. Первый аргумент метода uri поможет узнать наше намерение. Метод sUriMatcher.match(uri) вернёт нам нужную константу для дальнейшей работы. Остальные аргументы нам уже знакомы.

Также надо добавить информацию в манифест.

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

Адрес всегда должен начинаться с content://, очень похоже на http: и указывает на схему.

Далее идёт адрес для Content Authority, который обычно совпадает с пакетом вашего приложения. Он прописывается в манифесте (см. выше). Добавляем константу в класс HotelContract (см. ниже код).

Соединяем строку content:// с созданной константой в виде отдельной константы. Для работы с полученной строкой в виде Uri применим метод parse(), который как раз и возвратит объект Uri (см. ниже код).

Третья часть после слеша — это сами данные. В большинстве случаев это таблица вашей базы данных. Добавим ещё одну константу, которая будет присоединяться к предыдущему Uri (см. ниже код).

В классе GuestEntry добавляем дополнительную константу, которая соединяет все три части (см. ниже код).

После имени таблицы может идти четвёртая часть — один ряд из таблицы, который нам нужен для получения детальной информации, например, о госте. Для доступа к ряду таблицы можно использовать его идентификатор _id.

Таким образом адрес контент-провайдера нашего приложения: content://ru.alexanderklimov.cathouse/guests.

Информация о втором госте: content://ru.alexanderklimov.cathouse/guests/2

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

Внесём изменения в класс HotelContract.

Вернёмся в класс MainActivity и перепишем метод displayDatabaseInfo().

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

Запрос db.query() можно заменить на аналогичный от контент-провайдера, используя метод getContentResolver().

Метод query() отличается только первым параметром, вместо имени таблицы мы используем адрес таблицы.

Вернёмся в класс контент-провайдера. Метод insert() использует два параметра. Первый — URI также предназначен для выбора задачи, но вставка новой записи нужна только для всей таблицы, поэтому оператор switch будет состоять из одного варианта с константой GUESTS, вариант GUEST_ID не понадобится.

В классе MainActivity мы можем теперь отредактировать метод вставки новой записи в таблицу через контент-провайдер, убрав вызов базы данных и добавив и заменив вызов метода SQLiteDatabase.insert() на getContentResolver().insert().

Аналогично поправим метод в EditorActivity:

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

Перейдём к следующему этапу. Заменим TextView на ListView.

Создадим разметку res/layout/list_item.xml для отдельного элемента списка, состоящий из двух текстовых меток для имени и города.

В макете content_main.xml заменим TextView на ListView. Я оставил на память, позже можно удалить TextView. Также добавлены компоненты на случай, если список будет пуст.

Вот так будет выглядеть сейчас экран активности.

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

В MainActivity добавим ссылки на новые компоненты.

Извлечение данных является трудоёмким процессом, поэтому следует использовать отдельный поток для этой операции. Для работы с курсорами существует интерфейс LoaderManager.LoaderCallbacks с тремя методами. Реализуем его в активности.

Удалим метод displayDatabaseInfo() и метод активности onStart(). Теперь данные мы будем получать через загрузчик. Добавим код в onCreate().

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

Переходим в GuestProvider и в методе query() добавляем строчку кода перед return:

Похожий код вставляем в метод insertGuest():

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

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

В активности EditorActivity добавим код для приёма намерения.

Теперь мы можем переходить по щелчку по элементу списка. При этом заголовок будет «Изменение данных», чтобы было понятно, что мы находимся в режиме редактирования данных о госте.

Когда мы хотим редактировать данные о госте, нам нужно подгрузить его данные. Подключаем к активности интерфейс LoaderCallbacks и его методы.

Инициализируем загрузчик в onCreate().

Заменим метод insertGuest() на расширенную версию метода saveGuest(), который будет вставлять или редактировать данные в зависимости от логики программы.

Также включим «защиту от дурака», если попытаемся завести пустые данные.

Осталось написать код для удаления гостя из базы данных.

На главной активность есть пункт меню «Удалить всех гостей».

Код получился просто громадным. Если не заниматься контент-провайдерами постоянно, то вряд ли получится самостоятельно написать такую программу. Вот почему разработчики не любят контент-провайдер. Также вы можете пройти курс на Udacity — Android Basics: Data Storage | Udacity, в котором рассматривается контент-провайдер очень подробно (на англ.). В целях совместимости я даже переписал код, максимально похожий на код из курса.

Источник

Читайте также:  Есть ли дота для андроид
Оцените статью