SQLite vs Room cho App Android

📝 Giới Thiệu

Khi phát triển ứng dụng Android, một trong những phần quan trọng là lưu trữ và quản lý dữ liệu. SQLiteRoom là hai công nghệ phổ biến mà các lập trình viên Android sử dụng để xử lý dữ liệu nội bộ. Trong bài viết này, chúng ta sẽ so sánh hai công nghệ này, giúp bạn chọn lựa công nghệ phù hợp cho ứng dụng của mình.


📌 SQLite Là Gì?

SQLite là một cơ sở dữ liệu quan hệ (RDBMS) nhẹ và tích hợp sẵn trong Android. Nó không yêu cầu máy chủ cơ sở dữ liệu và lưu trữ dữ liệu dưới dạng các tệp trên bộ nhớ trong của thiết bị.

🔹 Các Tính Năng Chính:

  • Cơ sở dữ liệu nhẹ và tích hợp: SQLite rất nhẹ, dễ dàng tích hợp vào ứng dụng mà không cần kết nối mạng.
  • SQL thuần túy: Bạn phải sử dụng các câu lệnh SQL để thao tác với cơ sở dữ liệu.

🔸 Ví Dụ Sử Dụng SQLite:

1️⃣Tạo cơ sở dữ liệu và bảng

SQLiteOpenHelper dbHelper = new SQLiteOpenHelper(context) {
@Override
public void onCreate(SQLiteDatabase db) {
String createTable = "CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)";
db.execSQL(createTable);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS users");
onCreate(db);
}
};

🔍 Đọc Dữ Liệu (Select)

SQLiteDatabase db = dbHelper.getReadableDatabase();

Cursor cursor = db.query(
    "users",       // Table
    null,          // Columns (null = tất cả)
    null,          // WHERE
    null,          // WHERE args
    null,          // groupBy
    null,          // having
    null           // orderBy
);

if (cursor.moveToFirst()) {
    do {
        String name = cursor.getString(cursor.getColumnIndexOrThrow("name"));
        String email = cursor.getString(cursor.getColumnIndexOrThrow("email"));
        Log.d("SQLite", "Tên: " + name + ", Email: " + email);
    } while (cursor.moveToNext());
}

cursor.close();

📥 Thêm Dữ Liệu (Insert)

SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", "John Doe");
values.put("email", "john@example.com");

long newRowId = db.insert("users", null, values);
if (newRowId != -1) {
    Log.d("SQLite", "Thêm thành công: ID = " + newRowId);
} else {
    Log.d("SQLite", "Thêm thất bại");
}

🔁 Sửa Dữ Liệu (Update)

SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", "John Smith"); // Tên mới

// Điều kiện WHERE: sửa người có email cụ thể
String selection = "email = ?";
String[] selectionArgs = { "john@example.com" };

int count = db.update("users", values, selection, selectionArgs);
Log.d("SQLite", "Số dòng đã sửa: " + count);

🗑️ Xóa Dữ Liệu (Delete)

SQLiteDatabase db = dbHelper.getWritableDatabase();

// Điều kiện WHERE: xóa người có tên là "John Smith"
String selection = "name = ?";
String[] selectionArgs = { "John Smith" };

int deletedRows = db.delete("users", selection, selectionArgs);
Log.d("SQLite", "Số dòng đã xóa: " + deletedRows);


📌 Room Là Gì?

Room là một thư viện của Android Jetpack cung cấp một lớp trừu tượng hóa trên SQLite, giúp việc thao tác với cơ sở dữ liệu dễ dàng và an toàn hơn.

🔹 Các Tính Năng Chính:

  • Tự động sinh mã SQL: Room tự động chuyển đối tượng Java/Kotlin thành các câu lệnh SQL.
  • Quản lý cơ sở dữ liệu dễ dàng: Room hỗ trợ di chuyển cơ sở dữ liệu và kiểm tra tính hợp lệ của dữ liệu.
  • Tích hợp với LiveData: Room hỗ trợ LiveData để cập nhật UI khi dữ liệu thay đổi.

🔸 Ví Dụ Sử Dụng Room:

1️⃣Thêm phụ thuộc vào build.gradle

dependencies {
    implementation "androidx.room:room-runtime:2.4.0"
    annotationProcessor "androidx.room:room-compiler:2.4.0"
}

2️⃣Tạo Entity (đối tượng cơ sở dữ liệu):

@Entity(tableName = "users")
public class User {
    @PrimaryKey(autoGenerate = true)
    public int id;

    @ColumnInfo(name = "name")
    public String name;
}

3️⃣Tạo DAO (Data Access Object):

@Dao
public interface UserDao {
    @Insert
    void insert(User user);

    @Query("SELECT * FROM users")
    List<User> getAllUsers();
}

4️⃣Tạo Database:

@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}

5️⃣ Sử dụng Room trong ứng dụng:

AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "database-name").build();
UserDao userDao = db.userDao();

User user = new User();
user.name = "Jane Doe";
userDao.insert(user);

List<User> users = userDao.getAllUsers();
for (User u : users) {
    Log.d("Room", "User: " + u.name);
}

🔍 So Sánh SQLite và Room

Tiêu chíSQLiteRoom
Quản lý cơ sở dữ liệuThủ côngTự động
Viết mã SQLCần thiếtKhông cần (sử dụng annotation)
An toàn với kiểu dữ liệuKhông có
Tích hợp với MVVMKhông
Hỗ trợ LiveDataKhông

✅ Kết Luận

  • SQLite là lựa chọn phù hợp nếu bạn cần toàn quyền kiểm soát việc truy cập cơ sở dữ liệu và muốn viết mã SQL thủ công.
  • Room là lựa chọn tốt hơn cho hầu hết các ứng dụng Android nhờ vào tính tiện lợi, khả năng tự động sinh mã SQL và tích hợp với các thành phần khác trong Android Jetpack.

Xem thêm bài tiếp: https://tinhoc123.edu.vn/lap-trinh/lap-trinh-android-java/tich-hop-room-voi-livedata-va-viewmodel-trong-android/

Comments are closed.