Trong Android, cơ sở dữ liệu chính được sử dụng để lưu trữ và quản lý dữ liệu là SQLite. SQLite là một cơ sở dữ liệu quan hệ nhỏ gọn, có dung lượng nhẹ, không cần máy chủ (server-less), và hoàn toàn nhúng vào trong ứng dụng. Ngoài SQLite, Android còn hỗ trợ các giải pháp khác như Room Persistence Library – một lớp trừu tượng trên SQLite, giúp việc quản lý cơ sở dữ liệu trở nên dễ dàng và hiệu quả hơn.
1. SQLite
SQLite là gì?
SQLite là một hệ quản trị cơ sở dữ liệu quan hệ nhẹ, không cần máy chủ, và được nhúng trực tiếp trong ứng dụng Android. Nó hỗ trợ chuẩn SQL (Structured Query Language) cho các thao tác tạo, đọc, cập nhật và xóa (CRUD) dữ liệu. SQLite thường được sử dụng trong các ứng dụng Android để lưu trữ dữ liệu cục bộ (local data), như thông tin người dùng, dữ liệu ứng dụng, và các thông tin cấu hình.
Đặc điểm chính của SQLite
- Không cần cấu hình máy chủ: SQLite hoạt động độc lập, không yêu cầu cài đặt hay quản lý một máy chủ cơ sở dữ liệu riêng biệt.
- Dung lượng nhỏ gọn: Do kích thước nhẹ, SQLite rất phù hợp để nhúng vào ứng dụng di động.
- Không yêu cầu kết nối mạng: SQLite lưu trữ dữ liệu trên thiết bị cục bộ, không yêu cầu kết nối internet để hoạt động.
- SQL chuẩn: Bạn có thể thực hiện các thao tác SQL tiêu chuẩn như SELECT, INSERT, UPDATE, DELETE.
Sử dụng SQLite trong Android
Bạn có thể làm việc với SQLite bằng cách sử dụng lớp SQLiteOpenHelper để quản lý việc tạo và cập nhật cơ sở dữ liệu.
Ví dụ về SQLite trong Android:
public class MyDatabaseHelper extends SQLiteOpenHelper {
// Phiên bản và tên của cơ sở dữ liệu
private static final String DATABASE_NAME = "MyDatabase.db";
private static final int DATABASE_VERSION = 1;
// Bảng và cột
public static final String TABLE_NAME = "Users";
public static final String COLUMN_ID = "id";
public static final String COLUMN_NAME = "name";
public static final String COLUMN_EMAIL = "email";
// Tạo cơ sở dữ liệu
public MyDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
// Tạo bảng trong cơ sở dữ liệu
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + "("
+ COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
+ COLUMN_NAME + " TEXT,"
+ COLUMN_EMAIL + " TEXT" + ")";
db.execSQL(CREATE_TABLE);
}
// Nâng cấp cơ sở dữ liệu (nếu có thay đổi phiên bản)
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
// Thêm người dùng vào cơ sở dữ liệu
public void addUser(String name, String email) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_NAME, name);
values.put(COLUMN_EMAIL, email);
db.insert(TABLE_NAME, null, values);
db.close();
}
}
Trong ví dụ này, MyDatabaseHelper
là lớp trợ giúp để quản lý cơ sở dữ liệu SQLite, tạo bảng, thêm người dùng mới và xử lý các thao tác cơ bản khác.
Ưu điểm của SQLite
- Dễ sử dụng: SQLite được tích hợp sẵn trong Android SDK và không yêu cầu cấu hình phức tạp.
- Hiệu năng tốt: Dung lượng nhẹ, nhanh chóng và tiêu tốn ít tài nguyên hệ thống.
- Lưu trữ cục bộ: Thích hợp cho các ứng dụng cần lưu trữ dữ liệu mà không cần kết nối internet.
- Tương thích với chuẩn SQL: Dễ dàng thực hiện các thao tác SQL truyền thống như JOIN, WHERE, ORDER BY.
Nhược điểm của SQLite
- Chưa hỗ trợ đầy đủ tính năng của SQL: SQLite không hỗ trợ tất cả các tính năng SQL phức tạp như các cơ sở dữ liệu khác (ví dụ: không có stored procedures).
- Không phù hợp cho dữ liệu lớn: SQLite phù hợp cho các ứng dụng có dữ liệu vừa và nhỏ, không phải là giải pháp tối ưu cho các ứng dụng cần quản lý lượng dữ liệu khổng lồ.
2. Room Persistence Library
Room là một thư viện thuộc Jetpack của Android, cung cấp một cách tiếp cận cao cấp và dễ dàng hơn khi làm việc với SQLite. Nó giúp khắc phục nhược điểm của SQLite bằng cách đưa ra các API mạnh mẽ và an toàn hơn. Room sử dụng Entity, DAO (Data Access Object), và Database để quản lý cơ sở dữ liệu theo cách dễ hiểu và linh hoạt hơn.
Đặc điểm của Room
- Entity: Lớp đại diện cho bảng trong cơ sở dữ liệu.
- DAO: Các phương thức được định nghĩa trong DAO dùng để truy xuất dữ liệu từ cơ sở dữ liệu.
- Annotations: Sử dụng annotations như
@Entity
, @Dao
, @Query
, và @Database
để định nghĩa cấu trúc và hoạt động của cơ sở dữ liệu.
Ví dụ về Room:
@Entity(tableName = "users")
public class User {
@PrimaryKey(autoGenerate = true)
public int id;
public String name;
public String email;
}
@Dao
public interface UserDao {
@Insert
void insert(User user);
@Query("SELECT * FROM users WHERE id = :userId")
User getUserById(int userId);
}
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
Ưu điểm của Room:
- Truy xuất dữ liệu dễ dàng: Room hỗ trợ các thao tác với cơ sở dữ liệu một cách dễ dàng thông qua các đối tượng DAO và API.
- Truy vấn mạnh mẽ với SQL: Bạn vẫn có thể viết các truy vấn SQL thủ công.
- Tự động hóa một số tác vụ: Room hỗ trợ tự động kiểm tra kiểu dữ liệu và nhiều tính năng nâng cao khác.
Nhược điểm của Room:
- Học cách sử dụng: So với SQLite, việc sử dụng Room yêu cầu bạn học thêm cách sử dụng annotations và cách tổ chức mã.
- Thư viện bổ sung: Bạn cần thêm Room vào dự án và có một chút overhead khi tích hợp.
3. Các tùy chọn khác
Ngoài SQLite và Room, còn có các tùy chọn cơ sở dữ liệu khác mà bạn có thể sử dụng trong Android tùy vào yêu cầu của ứng dụng, ví dụ:
- Realm: Cơ sở dữ liệu NoSQL nhanh và dễ sử dụng, được thiết kế đặc biệt cho các ứng dụng di động.
- Firebase Realtime Database: Cơ sở dữ liệu đám mây của Google, cho phép lưu trữ và đồng bộ hóa dữ liệu thời gian thực.
- ObjectBox: Một giải pháp cơ sở dữ liệu đối tượng (object database) hiện đại, hiệu suất cao dành cho các ứng dụng di động.
Tóm tắt
- SQLite là cơ sở dữ liệu mặc định trong Android, giúp lưu trữ dữ liệu cục bộ với hiệu suất tốt.
- Room Persistence Library là lớp trừu tượng của SQLite, cung cấp cách tiếp cận dễ dàng và mạnh mẽ hơn để quản lý cơ sở dữ liệu.
- Ngoài ra, bạn có thể chọn các giải pháp cơ sở dữ liệu thay thế như Realm, Firebase, hoặc ObjectBox nếu cần tính năng đồng bộ thời gian thực hoặc mô hình NoSQL.
Việc lựa chọn giải pháp cơ sở dữ liệu phù hợp phụ thuộc vào yêu cầu của ứng dụng như quy mô dữ liệu, tính năng cần thiết và mức độ phức tạp của hệ thống.