Sử dụng SQLite database trong ứng dụng Android
SQLite là một cơ sở dữ liệu SQL mã nguồn mở, nó lưu trữ dữ liệu vào một tập tin văn bản trên một thiết bị. Nó mặc định đã được tích hợp trên thiết bị Android. Để truy cập dữ liệu này, bạn không cần phải thiết lập bất kỳ loại kết nối nào cho nó như JDBC, ODBC, ... SQLite được Richard Hipp viết ...
- SQLite là một cơ sở dữ liệu SQL mã nguồn mở, nó lưu trữ dữ liệu vào một tập tin văn bản trên một thiết bị. Nó mặc định đã được tích hợp trên thiết bị Android. Để truy cập dữ liệu này, bạn không cần phải thiết lập bất kỳ loại kết nối nào cho nó như JDBC, ODBC, ... SQLite được Richard Hipp viết dưới dạng thư viện bằng ngôn ngữ lập trình C.
- SQLite có các ưu điểm sau:
- Tin cậy: các hoạt động transaction (chuyển giao) nội trong cơ sở dữ liệu được thực hiện trọn vẹn, không gây lỗi khi xảy ra sự cố phần cứng
- Tuân theo chuẩn SQL92 (chỉ có một vài đặc điểm không hỗ trợ)
- Không cần cài đặt cấu hình
- Kích thước chương trình gọn nhẹ, với cấu hình đầy đủ chỉ không đầy 300 kB
- Thực hiện các thao tác đơn giản nhanh hơn các hệ thống cơ sở dữ liệu khách/chủ khác
- Không cần phần mềm phụ trợ
- Phần mềm tự do với mã nguồn mở, được chú thích rõ ràng
Trong phần này, tôi sẽ hướng dẫn các bạn về cách tạo ra một database trong SQLite và các class để xử lý tất cả các thao tác đối với SQLite.
Sau đây, tôi sẽ lấy một ví dụ về việc lưu trữ thông tin của các sinh viên vào trong cơ sở dữ liệu SQLite.
Cấu trúc bảng Students
Tạo Student class
Trước hết, ta sẽ viết Student class với các phương thức khởi tạo, getter, setter:
# Student.java package com.framgia.androidsqlite; public class Student { int id; String name; String address; String phone_number; public Student(int id, String name, String address, String phone_number) { super(); this.id = id; this.name = name; this.address = address; this.phone_number = phone_number; } public Student(String name, String address, String phone_number) { super(); this.name = name; this.address = address; this.phone_number = phone_number; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getPhone_number() { return phone_number; } public void setPhone_number(String phone_number) { this.phone_number = phone_number; } }
Tạo SQLite Database Handler class
Tiếp theo, ta sẽ tạo class để xử lý các thao tác CRUD(create, read, update, delete) đối với database.
- Đầu tiên, tạo một Android project (File => New Android Project)
- Tạo một class DatabaseHandler.java (src/package => New => Class)
- Class DatabaseHandler sẽ kế thừa class SQLiteOpenHelper (Đây là một class mà Android cho phép bạn xử lý các thao tác đối với database của SQLite, vì vậy bạn có thể tạo một class khác thừa kế nó và tùy chỉnh việc điều khiển database theo ý mình):
- Sau khi kế thừa từ class SQLiteOpenHelper, việc chúng ta cần làm tiếp theo đó là override lại 2 phương thức onCreate() và onUpgrade
- onCreate(): Đây là nơi để chúng ta viết những câu lệnh tạo bảng. Nó được gọi khi database đã được tạo.
- onUpgrade(): Nó được gọi khi database được nâng cấp, ví dụ như chỉnh sửa cấu trúc các bảng, thêm những thay đổi cho database,..
# DatabaseHandler.java package com.framgia.androidsqlite; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; public class DatabaseHandler extends SQLiteOpenHelper{ private static final String DATABASE_NAME = "schoolManager"; private static final int DATABASE_VERSION = 1; private static final String TABLE_NAME = "students"; private static final String KEY_ID = "id"; private static final String KEY_NAME = "name"; private static final String KEY_ADDRESS = "address"; private static final String KEY_PHONE_NUMBER = "phone_number"; public DatabaseHandler(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { String create_students_table = String.format("CREATE TABLE %s(%s INTEGER PRIMARY KEY, %s TEXT, %s TEXT, %s TEXT)", TABLE_NAME, KEY_ID, KEY_NAME, KEY_ADDRESS, KEY_PHONE_NUMBER); db.execSQL(create_students_table); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { String drop_students_table = String.format("DROP TABLE IF EXISTS %s", TABLE_NAME); db.execSQL(drop_students_table); onCreate(db); } }
Tiếp theo, chúng ta sẽ viết những phương thức để xử lý việc đọc, ghi đối với database.
Thêm một record mới
Chúng ta sẽ tạo một phương thức là addStudent nhận một object Student như là một tham số. ContentValues được sử dụng để lưu các giá trị tương ứng với các trường trong bảng. SQLiteDatabase có chứa các phương thức tạo, xóa, thực thi các lệnh SQL, nó sẽ được sử dụng để insert các giá trị từ object Student vào các trường trong bảng students.
public void addStudent(Student student) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(KEY_NAME, student.getName()); values.put(KEY_ADDRESS, student.getAddress()); values.put(KEY_PHONE_NUMBER, student.getPhone_number()); db.insert(TABLE_NAME, null, values); db.close(); }
Truy vấn dữ liệu trong bảng
- Ta sẽ dùng Cursor để lưu giá trị trả về của các hàm sau đây:
public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)
public Cursor rawQuery(String sql, String[] selectionArgs)
- Phương thức getStudent() sẽ đọc một record student trong bảng, nhận student id là tham số.
public Student getStudent(int studentId) { SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.query(TABLE_NAME, null, KEY_ID + " = ?", new String[] { String.valueOf(studentId) },null, null, null); if(cursor != null) cursor.moveToFirst(); Student student = new Student(cursor.getInt(0), cursor.getString(1), cursor.getString(2), cursor.getString(3)); return student; }
- db.query sẽ trả về một Cursor, lúc này Cursor đầu đọc chưa trỏ tới dòng dữ liệu nào cả, do đó, ta phải gọi lệnh .moveToFirst() để Cursor có thể trỏ tới dòng đầu tiên.
- Phương thức getAllStudents() sẽ trả về tất cả student có trong bảng dưới dạng một array list của Student.
public List<Student> getAllStudents() { List<Student> studentList = new ArrayList<>(); String query = "SELECT * FROM" + TABLE_NAME; SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawQuery(query, null); cursor.moveToFirst(); while(cursor.isAfterLast() == false) { Student student = new Student(cursor.getInt(0), cursor.getString(1), cursor.getString(2), cursor.getString(3)); studentList.add(student); cursor.moveToNext(); } return studentList; }
Cập nhật dữ liệu trong bảng
Chúng ta sử dụng hàm update của SQLiteDatabase để cập nhật dữ liệu trong bảng theo một điều kiện bất kỳ nào đó.
public int update(String table, ContentValues values, String whereClause, String[] whereArgs)
- Đối số 1: tên bảng
- Đối số 2: đối tượng muốn chỉnh sửa (với giá trị mới)
- Đối số 3: tập các điều kiện lọc (dùng dấu ? để tạo điều kiện lọc)
- Đối số 4: tập các giá trị ủa điều kiện lọc (lấy theo đúng thứ tự)
public void updateStudent(Student student) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(KEY_NAME, student.getName()); values.put(KEY_ADDRESS, student.getAddress()); values.put(KEY_PHONE_NUMBER, student.getPhone_number()); db.update(TABLE_NAME, values, KEY_ID + " = ?", new String[] { String.valueOf(student.getId()) }); db.close(); }
Xóa một record
Chúng ta sử dụng hàm delete của SQLiteDatabase để xóa dữ liệu của một hoặc một số record trong bảng theo một điều kiện bất kỳ nào đó
public int delete(String table, String whereClause, String[] whereArgs)
- Đối số 1: tên bảng
- Đối số 2: tập điều kiện lọc
- Đối số 3: tập các giá trị của điều kiện lọc
public void deleteStudent(int studentId) { SQLiteDatabase db = this.getWritableDatabase(); db.delete(TABLE_NAME, KEY_ID + " = ?", new String[] { String.valueOf(studentId) }); db.close(); }
Trên đây, tôi đã giới thiệu qua về SQLite và cách sử dụng nó trong Android, hi vọng nó sẽ giúp ích cho bạn đọc (yeah)