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()
- 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.
- 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.