Android SQLite Database Tutorial

Android cung cấp một số cách để lưu trữ dữ liệu người dùng và ứng dụng. SQLite là một cách để lưu trữ dữ liệu người dùng. SQLite là một cơ sở dữ liệu rất nhẹ cân mà đi kèm với hệ điều hành Android. Trong hướng dẫn này, tôi sẽ thảo luận cách viết các lớp để xử lý tất cả các thao tác SQLite.

DOWNLOAD

Trong bài hướng dẫn này chúng ta sẽ xây dựng ví dụ lưu trữ thông tin liên hệ trong SQLite database. Chúng ta sử dụng một bảng với tên Contacts để lưu những thông tin liên hệ. Bảng này sẽ có cấu trúc gồm 3 cột: id(INT), name(TEXT), phone_number(TEXT).

Cấu trúc bảng

Đối tượng Contact

Để dễ dàng làm việc với dữ liệu contacts, bạn cần tạo ra một đối tượng chứa các thông tin của một contact với các phương thức getter và setter. Chúng ta nên viết vào một file riêng để dễ quả lý.

// Contact.java
package io.codetheworld.androidsqlite; 
 
public class Contact {
     
    // Các biến private
    int _id;
    String _name;
    String _phone_number;
     
    // Một phương thức khởi tạo rỗng
    public Contact(){
         
    }
    // Phương thức khởi tạo với đầy đủ các params
    public Contact(int id, String name, String _phone_number){
        this._id = id;
        this._name = name;
        this._phone_number = _phone_number;
    }
     
    // Phương thức khởi tạo chỉ có thông tin cho name và phone_number
    public Contact(String name, String _phone_number){
        this._name = name;
        this._phone_number = _phone_number;
    }
    // lấy giá trị id
    public int getID(){
        return this._id;
    }
     
    // set giá trị id
    public void setID(int id){
        this._id = id;
    }
     
    // lấy giá trị name
    public String getName(){
        return this._name;
    }
     
    // set giá trị name
    public void setName(String name){
        this._name = name;
    }
     
    // lấy giá trị phone_number
    public String getPhoneNumber(){
        return this._phone_number;
    }
     
    // set giá trị phone_number
    public void setPhoneNumber(String phone_number){
        this._phone_number = phone_number;
    }
}

Class làm việc với SQLite

Chúng ta cần phải viết một class để làm việc với database, với các phương thức cơ bảnCRUD(Create, Read, Update and Delete).

Class này sẽ extend từ SQLiteOpenHelper

public class DatabaseHandler extends SQLiteOpenHelper {

Sau khi extend từ lớp này chúng ta cần override lại hai phương thức là onCreate() và onUpgrage()

  1. onCreate() – Ở đây là chúng ta sẽ viết lệnh để tạo ra một bảng mới trong SQLite. Nó sẽ được gọi khi databse được khởi tạo.
  2. onUpgrade() – Phương thức này được gọi khi database được thay đổi như sửa đổi cấu trúc bảng, thêm các constraints() vào db…
// DatabaseHandler.java
public class DatabaseHandler extends SQLiteOpenHelper {
 
    // Toàn bộ các biến tĩnh
    // Phiên bản Database
    private static final int DATABASE_VERSION = 1;
 
    // Tên Database
    private static final String DATABASE_NAME = "contactsManager";
 
    // Tên bảng "Contacts"
    private static final String TABLE_CONTACTS = "contacts";
 
    // Các trường trong bảng "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);
    }
 
    // Tạo bảng
    @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);
    }
 
    // Khi có sự kiện cập nhật database
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Xóa bảng "Contacts" (nếu đã tồn tại)
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);
 
        // Khởi tạo lại bảng "Contacts"
        onCreate(db);
    }
}

Các phương thức làm việc với bảng trong SQLite: CRUD (Create, Read, Update and Delete)

Bây giờ chúng ta sẽ viết những phương thức để đọc và ghi lên database. Ở đây chúng ta sẽ viết những phương thức như bên dưới để làm việc với bảng contacts:

// Thêm mới một contact
public void addContact(Contact contact) {}
 
// Lấy một contact theo id
public Contact getContact(int id) {}
 
// Lấy toàn bộ contacts
public List<Contact> getAllContacts() {}
 
// Đếm số lượng contacts
public int getContactsCount() {}

// Cập nhật một contact
public int updateContact(Contact contact) {}
 
// Xóa một contact
public void deleteContact(Contact contact) {}

Chúng ta sẽ thực từng phương thức:

Thêm mới dữ liệu

Phương thức addContact()  cho truyền vào một đối tượng Contact. Chúng ta cần tạo một  ContentValues từ đối tượng Contact truyền vào (do cú pháp thêm mới vào SQLite là sẽ thông qua mộtContentValues). Khi chúng ta đã có data sẵn sàng, tiến hành kết nối db và thêm dữ liệu mới vào, cuối cùng là đóng kết nối db lại.

// Thêm mới contact
public void addContact(Contact contact) {
    SQLiteDatabase db = this.getWritableDatabase(); // Mở kết nối cho phép ghi vào db
 
    ContentValues values = new ContentValues();
    values.put(KEY_NAME, contact.getName()); // Contact Name
    values.put(KEY_PH_NO, contact.getPhoneNumber()); // Contact Phone Number
 
    // Chèn bản ghi vào db
    db.insert(TABLE_CONTACTS, null, values);
    db.close(); // Đóng kết nối database
}

Đọc dữ liệu từ database

Phương thức getContact()  sẽ trả lại một đối tượng contact nếu tìm thấy trong db theo id truyền vào.

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();
 else
     return null;
 // return contact
 return new Contact(Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2));
}

Phương thức getAllContacts() sẽ trả lại toàn bộ contacts có trong db, dữ liệu sẽ là một List các đối tượng có kiểu là Contact. Chúng ta sẽ cần một vòng lặp để duyệt qua tất cả các contacts.

// Lấy toàn bộ contacts
public List<Contact> getAllContacts() {
    List<Contact> contactList = new ArrayList<>();
    // Select All Query
    String selectQuery = "SELECT  * FROM " + TABLE_CONTACTS;
 
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);
 
    // Lặp để lấy ra toàn bộ dữ liệu và thêm nó vào list
    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));
            // Thêm contact vào list
            contactList.add(contact);
        } while (cursor.moveToNext());
    }
 
    // return contact list
    return contactList;
}

Phương thức getContactsCount() sẽ trả lại số lượng contacts có trong SQLite database.

    // Getting contacts Count
    public int getContactsCount() {
        String countQuery = "SELECT  * FROM " + TABLE_CONTACTS;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(countQuery, null);
        cursor.close();
 
        // return count
        return cursor.getCount();
    }

Cập nhật dữ liệu

Phương thức updateContact() sẽ cập nhật thông tin của một contact trong database. Đầu vào của phương thức này là một đối tượng Contact sẽ được cập nhật.

// Cập nhật contact
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());
 
    // cập nhật dữ liệu
    return db.update(TABLE_CONTACTS, values, KEY_ID + " = ?",
            new String[] { String.valueOf(contact.getID()) });
}

Xóa dữ liệu

Phương thức deleteContact()  sẽ xóa một bản ghi contact trong database. Đầu vào của phương thức này là một đối tượng Contact cần xóa.

// Xóa bản ghi contact
public void deleteContact(Contact contact) {
    SQLiteDatabase db = this.getWritableDatabase();
    db.delete(TABLE_CONTACTS, KEY_ID + " = ?",
            new String[] { String.valueOf(contact.getID()) });
    db.close();
}

Nội dung của file DatabaseHandler.java sau khi hoàn thiện

package io.codetheworld.androidsqlite;

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 {
    
    // Toàn bộ các biến tĩnh
    // Phiên bản Database
    private static final int DATABASE_VERSION = 1;
    
    // Tên Database
    private static final String DATABASE_NAME = "contactsManager";
    
    // Tên bảng "Contacts"
    private static final String TABLE_CONTACTS = "contacts";
    
    // Các trường trong bảng "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);
    }
    
    // Tạo bảng
    @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);
    }
    
    // Khi có sự kiện cập nhật database
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Xóa bảng "Contacts" (nếu đã tồn tại)
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_CONTACTS);
        
        // Khởi tạo lại bảng "Contacts"
        onCreate(db);
    }
    
    // Thêm mới contact
    public void addContact(Contact contact) {
        SQLiteDatabase db = this.getWritableDatabase(); // Mở kết nối cho phép ghi vào db
        
        ContentValues values = new ContentValues();
        values.put(KEY_NAME, contact.getName()); // Contact Name
        values.put(KEY_PH_NO, contact.getPhoneNumber()); // Contact Phone Number
        
        // Chèn bản ghi vào db
        db.insert(TABLE_CONTACTS, null, values);
        db.close(); // Đóng kết nối database
    }
    
    // Lấy contact theo id
    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();
        else
            return null;
        // return contact
        return new Contact(Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2));
    }
    
    // Lấy toàn bộ contacts
    public List<Contact> getAllContacts() {
        List<Contact> contactList = new ArrayList<>();
        // Select All Query
        String selectQuery = "SELECT  * FROM " + TABLE_CONTACTS;
        
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);
        
        // Lặp để lấy ra toàn bộ dữ liệu và thêm nó vào list
        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));
                // Thêm contact vào list
                contactList.add(contact);
            } while (cursor.moveToNext());
        }
        
        // return contact list
        return contactList;
    }
    
    // Getting contacts Count
    public int getContactsCount() {
        String countQuery = "SELECT  * FROM " + TABLE_CONTACTS;
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(countQuery, null);
        cursor.close();
        
        // return count
        return cursor.getCount();
    }
    
    // Cập nhật contact
    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());
        
        // cập nhật dữ liệu
        return db.update(TABLE_CONTACTS, values, KEY_ID + " = ?",
                new String[]{String.valueOf(contact.getID())});
    }
    
    // Xóa bản ghi contact
    public void deleteContact(Contact contact) {
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_CONTACTS, KEY_ID + " = ?", new String[]{String.valueOf(contact.getID())});
        db.close();
    }
}

 

Sử dụng

package io.codetheworld.androidsqlite;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import java.util.List;

public class MainActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        DatabaseHandler db = new DatabaseHandler(this);
        
        // Thêm mới dữ liệu mẫu
        Log.d("Insert: ", "Inserting ..");
        db.addContact(new Contact("hoangdv", "9100000000"));
        db.addContact(new Contact("hacker", "9199999999"));
        db.addContact(new Contact("BillGates", "9522222222"));
        db.addContact(new Contact("Bloger", "9533333333"));
        
        // Đọc toàn bộ contacts
        Log.d("Reading: ", "Reading all contacts..");
        List<Contact> contacts = db.getAllContacts();
        
        for (Contact cn : contacts) {
            String log = "Id: " + cn.getID() + " ,Name: " + cn.getName() + " ,Phone: " + cn.getPhoneNumber();
            // Hiển thị contact ra log
            Log.d("Name: ", log);
        }
    }
}

 

Các bạn có thể xem dữ liệu được in ra ở phần logcat của Android Studio

Tiếp theo

Bài sau mình sẽ hướng dẫn viết giao diện cho ứng dụng quả lý contact, sử dụng nhưng file đã viết trong bài này.

 

Từ khóa: ,