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

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

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

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

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

Шаг 1.

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

public interface IDatabaseHandler {
    public void addContact(Contact contact);
    public Contact getContact(int id);
    public List<Contact> getAllContacts();
    public int getContactsCount();
    public int updateContact(Contact contact);
    public void deleteContact(Contact contact);
    public void deleteAll();
}

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

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

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

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

package com.devcolibri.DBAndroid;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import java.util.ArrayList;
import java.util.List;

public class DatabaseHandler extends SQLiteOpenHelper implements IDatabaseHandler {

    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "contactsManager";
    private static final String TABLE_CONTACTS = "contacts";
    private static final String KEY_ID = "id";
    private static final String KEY_NAME = "name";
    private static final String KEY_PH_NO = "phone_number";

    public DatabaseHandler(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("
                + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
                + KEY_PH_NO + " TEXT" + ")";
        db.execSQL(CREATE_CONTACTS_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);

        onCreate(db);
    }

    @Override
    public void addContact(Contact contact) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(KEY_NAME, contact.getName());
        values.put(KEY_PH_NO, contact.getPhoneNumber());

        db.insert(TABLE_CONTACTS, null, values);
        db.close();
    }

    @Override
    public Contact getContact(int id) {
        SQLiteDatabase db = this.getReadableDatabase();

        Cursor cursor = db.query(TABLE_CONTACTS, new String[] { KEY_ID,
                KEY_NAME, KEY_PH_NO }, KEY_ID + "=?",
                new String[] { String.valueOf(id) }, null, null, null, null);

        if (cursor != null){
            cursor.moveToFirst();
        }

        Contact contact = new Contact(Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2));

        return contact;
    }

    @Override
    public List<Contact> getAllContacts() {
        List<Contact> contactList = new ArrayList<Contact>();
        String selectQuery = "SELECT  * FROM " + TABLE_CONTACTS;

        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);

        if (cursor.moveToFirst()) {
            do {
                Contact contact = new Contact();
                contact.setID(Integer.parseInt(cursor.getString(0)));
                contact.setName(cursor.getString(1));
                contact.setPhoneNumber(cursor.getString(2));
                contactList.add(contact);
            } while (cursor.moveToNext());
        }

        return contactList;
    }

    @Override
    public int updateContact(Contact contact) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_NAME, contact.getName());
        values.put(KEY_PH_NO, contact.getPhoneNumber());

        return db.update(TABLE_CONTACTS, values, KEY_ID + " = ?",
                new String[] { String.valueOf(contact.getID()) });
    }

    @Override
    public void deleteContact(Contact contact) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_CONTACTS, KEY_ID + " = ?", new String[] { String.valueOf(contact.getID()) });
        db.close();
    }

    @Override
    public void deleteAll() {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_CONTACTS, null, null);
        db.close();
    }

    @Override
    public int getContactsCount() {
        String countQuery = "SELECT  * FROM " + TABLE_CONTACTS;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(countQuery, null);
        cursor.close();

        return cursor.getCount();
    }
}

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

public DatabaseHandler(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

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

@Override
public void onCreate(SQLiteDatabase db) {
    String CREATE_CONTACTS_TABLE = "CREATE TABLE " + TABLE_CONTACTS + "("
            + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
            + KEY_PH_NO + " TEXT" + ")";
    db.execSQL(CREATE_CONTACTS_TABLE);
}

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

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);

    onCreate(db);
}

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

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

@Override
public void addContact(Contact contact) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(KEY_NAME, contact.getName());
    values.put(KEY_PH_NO, contact.getPhoneNumber());

    db.insert(TABLE_CONTACTS, null, values);
    db.close();
}

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

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

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

Шаг 2.

Создаем сущность Contact:

package com.devcolibri.DBAndroid;

public class Contact {

    int _id;
    String _name;
    String _phone_number;

    public Contact(){
    }

    public Contact(int id, String name, String _phone_number){
        this._id = id;
        this._name = name;
        this._phone_number = _phone_number;
    }

    public Contact(String name, String _phone_number){
        this._name = name;
        this._phone_number = _phone_number;
    }

    public int getID(){
        return this._id;
    }

    public void setID(int id){
        this._id = id;
    }

    public String getName(){
        return this._name;
    }

    public void setName(String name){
        this._name = name;
    }

    public String getPhoneNumber(){
        return this._phone_number;
    }

    public void setPhoneNumber(String phone_number){
        this._phone_number = phone_number;
    }

}

Шаг 3.

Пишем MainActivity:

package com.devcolibri.DBAndroid;

import android.app.Activity;
import android.os.Bundle;

import java.util.List;

public class Main extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        DatabaseHandler db = new DatabaseHandler(this);

        System.out.println("Inserting ..");
        db.addContact(new Contact("Empty and One contact", "806800000"));

        System.out.println("Reading all contacts..");
        List<Contact> contacts = db.getAllContacts();
        for (Contact cn : contacts) {
            String log = "Id: "+cn.getID()+" ,Name: " + cn.getName() + " ,Phone: " + cn.getPhoneNumber();
            System.out.print("Name: ");
            System.out.println(log);
        }

        db.deleteAll();
    }
}

 Запускаем!

 
 

Урок создан: 19 февраля 2013 | Просмотров: 33394 | Автор: Александр Барчук | Правила перепечатки


Добавить комментарий

Добавить комментарий

Ваш e-mail не будет опубликован.

Комментарии:

  • 24 сентября 2013 в 10:45

    Upee

    А если у меня стоит задача АПДЕТНУТЬ запись, где и что мне надо подредактировать?

    • 24 сентября 2013 в 13:55

      Александр Барчук

      Есть метод updateContact(Contact contact), он осуществляет обновление. Или если брать основы, то метод db.update().

  • 10 декабря 2013 в 19:52

    Аноним

    изящный подход, напоминает орм, удобно

  • 25 июля 2014 в 15:21

    Nemo

    будет ли видео урок по SQLite ?

  • 06 сентября 2014 в 16:36

    Sergey

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

  • 30 сентября 2014 в 13:52

    Аноним

    а где эта база находится,или как указать на внешнюю карту памяти

    • 02 октября 2014 в 12:30

      Александр Барчук

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

      • 03 декабря 2014 в 00:54

        Аноним

        Почему в некоторых методах ты закрываешь базу данных или курсор, а в некоторых нет?

  • 29 января 2015 в 16:10

    vaccum

    у класса Cursor есть методы помимо, getString(). Вместо этого «Integer.parseInt(cursor.getString(0))» надо было использовать cursor.getInt().

  • 25 сентября 2015 в 22:57

    Павел

    А если мне надо вывести не все контакты, только один? Выбор делать по ID?