Giới thiệu
Trong quá trình làm việc của mình, tôi đã có cơ hội tiếp xúc với các hệ thống doanh nghiệp nổi tiếng như Oracle, SAP, và 1C. Một điểm chung giữa chúng là khả năng tạo ra các form tự động chỉ bằng cách định nghĩa bảng dữ liệu. Nếu không cần tùy chỉnh quá nhiều, bạn sẽ có ngay các form để:
- Duyệt danh sách
- Thêm và chỉnh sửa bản ghi
- Đánh dấu để xóa
- Xóa hoặc sao chép mục
Điều này luôn mang lại cảm giác tự nhiên, giúp bạn tập trung vào dữ liệu và logic kinh doanh thay vì hạ tầng.
Nỗi đau trong phát triển Android
Khi chuyển sang phát triển Android, tôi đã gặp rất nhiều khó khăn. Mỗi khi muốn thử nghiệm một ý tưởng đơn giản, tôi cần:
- Định nghĩa thực thể (entities)
- Viết DAO
- Thêm repositories
- Tạo ViewModel
- Xây dựng form trong Compose
- Kết nối điều hướng
Cảm giác như tôi phải viết scaffolding trong nhiều ngày trước khi có thể thấy ý tưởng của mình hoạt động.
Nỗ lực giải quyết vấn đề
Đó là lý do tôi bắt đầu phát triển một framework mà tôi gọi là Compose Entity. Khái niệm rất đơn giản:
- Bạn chỉ cần định nghĩa một thực thể,
- Tất cả các phần còn lại — bảng SQLite, DAO, repository, form mặc định và điều hướng — sẽ được tự động tạo ra cho bạn.
Bạn vẫn có thể tùy chỉnh các form với các Composables của riêng bạn nếu muốn, nhưng không bắt buộc.
Ví dụ về việc sử dụng Compose Entity
kotlin
@CeEntity(tableName = "person")
@CeGenerator(type = GeneratorType.Reference, generationLevel = GenerationLevel.UI,
hasDetails = true, detailsEntityClass = DetailsPersonInfo::class)
@CeCreateTable(tableName = "person")
data class RefPersones(
override var id: Long,
override var date: Long,
override var name: String,
override var isMarkedForDeletion: Boolean,
@CeField(type = FieldTypeHelper.NUMBER, label = "Tuổi", placeHolder = "Chọn tuổi")
var age: Int,
@CeField(related = true, relatedEntityClass = RefGroupes::class, type = FieldTypeHelper.SELECT, extName = "groupe",
label = "Nhóm", placeHolder = "Chọn nhóm của người")
var groupeId: Long
): CommonReferenceEntity(id, date, name, isMarkedForDeletion) {
override fun toString(): String {
return "$id: $name"
}
}
Chỉ với định nghĩa này, tôi ngay lập tức có một bảng cơ sở dữ liệu, DAO, repository, và một form UI hoạt động cho việc thêm/chỉnh sửa/xóa.
Quá trình Di chuyển dữ liệu
Phần này rất quan trọng đối với tôi. Trong các hệ thống như Room, việc di chuyển dữ liệu có thể cảm thấy khó đoán. Compose Entity hoạt động như sau:
- Các bảng mới được tạo tự động,
- Những thay đổi đối với các bảng hiện có (thêm/xóa trường) yêu cầu bạn viết lệnh
ALTER TABLE
của riêng mình.
Có thể nghe có vẻ ít tự động hóa hơn, nhưng lợi ích là:
- Không có bất ngờ,
- Kiểm soát hoàn toàn cách dữ liệu phát triển,
- Kiểm tra thời gian biên dịch đảm bảo rằng các thực thể luôn khớp với schema của DB.
Tại sao tôi chia sẻ điều này
Đối với tôi, điều này giúp giảm thiểu boilerplate khoảng 90%. Tôi có thể kiểm tra một ý tưởng trong vài phút, không phải vài ngày. Nó cảm thấy gần gũi hơn với quy trình làm việc mà tôi yêu thích trong Oracle, SAP, và 1C.
Tôi chia sẻ điều này ở đây vì tôi muốn nghe phản hồi:
- Bạn có nghĩ rằng cách tiếp cận này hợp lý không?
- Bạn có thấy nó hữu ích trong các dự án Android của mình không?
- Hay bạn thích viết mọi thứ thủ công để có được sự kiểm soát tối đa?
Tạo dự án Android với tên và gói của bạn
Để bắt đầu, bạn có thể tạo một dự án Android với tên và gói của mình tại cetempl.homeclub.top.
Ví dụ đầy đủ về ứng dụng dựa trên Compose Entity
Bạn có thể tham khảo ví dụ đầy đủ về ứng dụng dựa trên Compose Entity tại Github.
Thực hành tốt nhất
- Định nghĩa rõ ràng các thực thể: Điều này giúp cho việc tự động hóa được chính xác và dễ dàng hơn trong việc quản lý dữ liệu.
- Tùy chỉnh khi cần thiết: Mặc dù bạn có thể sử dụng các form tự động, hãy luôn sẵn sàng tùy chỉnh khi cần để đáp ứng yêu cầu nghiệp vụ.
Những cạm bẫy thường gặp
- Quá phụ thuộc vào tự động hóa: Đôi khi việc quá dựa vào tự động hóa có thể dẫn đến việc bạn không hiểu rõ cách mà hệ thống hoạt động.
- Không kiểm tra kỹ lưỡng: Luôn luôn kiểm tra các thay đổi trong cơ sở dữ liệu để đảm bảo rằng mọi thứ hoạt động như mong đợi.
Mẹo hiệu suất
- Sử dụng lazy loading: Khi làm việc với các danh sách lớn, hãy cân nhắc sử dụng lazy loading để cải thiện hiệu suất.
- Tối ưu hóa truy vấn: Đảm bảo rằng các truy vấn của bạn được tối ưu hóa để giảm thiểu thời gian phản hồi.
Khắc phục sự cố
- Lỗi di chuyển dữ liệu: Nếu bạn gặp lỗi trong quá trình di chuyển, hãy kiểm tra các lệnh
ALTER TABLE
và đảm bảo rằng chúng được viết chính xác. - Vấn đề với DAO: Nếu DAO không hoạt động như mong đợi, hãy kiểm tra lại các phương thức và đảm bảo rằng chúng đã được định nghĩa chính xác.
Kết luận
Tôi hy vọng rằng thông tin này sẽ hữu ích cho bạn trong việc phát triển ứng dụng Android với Jetpack Compose và SQLite. Hãy thử nghiệm với Compose Entity và cho tôi biết ý kiến của bạn. Chúc bạn thành công trong các dự án phát triển của mình!