1. GreenDao là gì?
Nó là một thư viện mà theo mình hiểu nôm na thì nó là một cách thức để giao tiếp ,làm việc với SQLite trong ứng dụng Android. GreenDao có từ năm 2012 và bây giờ đã đến phiên bản 1.3
+,So với cách làm việc thông thường thì việc sử dụng GreenDao mang lại rất nhiều ưu điểm:
1.Hiệu suất tối đa
2.Dễ dàng sử dụng
3.Tối ưu hóa cho Android
4.Sử dụng bộ nhớ tối thiểu
5. kích cỡ thư viện nhỏ
và theo như mình tìm hiểu thì :
-, Tốc độ thực thi của GreenDao nhanh hơn rất nhiều so với việc thao tác trên ORMLite:
cụ thể là:
- 3 lần: Viết
- 12 lần: Đọc 10000 đối tượng trong một bảng
- 2-3 lần: Đọc một hàng
- 15 lần : Sử dụng câu lệnh tìm kiếm "LIKE" for 100 bản ghi trong 10000 đối tượng của bảng
-, GreenDao cũng nhanh hơn so với việc thực hiện câu lệnh raw SQLite
Nói chung là hiểu nôm na đây là cách thao tác mới với SQLite, nó còn mới, dễ sử dụng, nhanh, gọn và rất cần học.
2. GreenDao sẽ làm gì?
Nó sẽ tự động sinh ra các thực thể cùng các thuộc tính mà mình quy định gọi là Entity chẳng hạn, mỗi Entity lại có một Lớp được sinh kèm là EntityDao. Lớp này có chứa tất cả các phương thức cơ bản để có thể tương tác với SQLite ví dụ như insert, update, delete và tham số truyền vào thường là một đối tượng của một thực thể.
Ngoài ra thì còn 2 lớp khác được sinh ra kèm là DaoMaster và DaoSession
3. Hướng dẫn thao tác với GreenDao trong Android
Mình thích học qua các ví dụ cho nó trực quan và dễ hiểu nên mình sẽ làm một ví dụ sử dụng GreenDao luôn, vừa làm mình sẽ vừa giải thích cho các bạn
3.1 tạo các lớp thực thể và bảng
GreenDao có một ví dụ để tham khảo, các bản có thể download tại đây
https://github.com/greenrobot/greenDAO
Mình sẽ hướng dẫn thông qua project greenDao cung cấp sẵn cho nó tiện:
sau đó bạn import - Java project : DaoExampleGenerator
- Android Project: DaoExample
Java project Chắc chắn sẽ lỗi vì bạn thiếu thư viện, Bạn download thư viện ở đây:
(có thể có sẵn trong thư mục vừa download , mình chưa kiểm tra)
Download thư viện dành cho GreenDao
-, Sau khi download xong, trong đây có 2 thư viện là
freemarker.jar và
greendao-generator.jar dùng để import vào Java project và
greendao-1.3.1.jar dùng để import vào Android Project
Bây giờ bắt đầu thực hành nhé:
0. tạo 1 Androdi project , mình đặt là sampleAndroid ,sau đó tạo 1 thư mục source có tên src-gen
1.bạn tạo 1 Java project cho việc tự sinh các lớp thực thể mà
mình sẽ giao tiếp trong Android
Để tiện mình sẽ lấy luôn Java project của greenDao ,project này sẽ tự sinh ra 3 lớp thực thể gồm có
Note: id ---------- Long
text ---------String
comment --- String
Customer: id ---------- Long
text ---------String
Order : id ------------- Long
date----------- Date
customerId---- Long
Các bạn Import project DaoExampleGenerator mà mình đã nói ở trên rồi import 2 thư viện
freemarker.jar và
greendao-generator.jar đã download ở trên vào.
có mỗi 1 lớp là ExampleDaoGenerator.java , ở đây mỗi bảng trong SQLite sẽ được tạo ra dựa theo các thuộc tính của mỗi đối tượng . Tại hàm main ()
Schema schema = new Schema(3, "de.greenrobot.daoexample");
addNote(schema);
addCustomerOrder(schema);
new DaoGenerator().generateAll(schema, "C:/Users/hung/Documents/FriendBook/sampleAndroid/src-gen");
Trong đó: "de.greenrobot.daoexample" là nơi lưu trữ các Entity trong thư mục Android project C:/Users/hung/Documents/FriendBook/sampleAndroid/src-gen (
khi các bạn tạo Android project thì tạo 1 thư mục source tên là src-gen như đã nói ở trên).sampleAndroid là Android project của mình
- tạo bảng có tên là Note:
private static void addNote(Schema schema) {
Entity note = schema.addEntity("Note");
note.addIdProperty();
note.addStringProperty("text").notNull();
note.addStringProperty("comment");
note.addDateProperty("date");
}
- 2 bảng Customer và Order có quan hệ 1-n , bảng Order và Customer có quan hệ 1-1 nên ta sẽ tạo ra như sau:
private static void addCustomerOrder(Schema schema) {
Entity customer = schema.addEntity("Customer");
customer.addIdProperty();
customer.addStringProperty("name").notNull();
Entity order = schema.addEntity("Order");
order.setTableName("ORDERS"); // "ORDER" is a reserved keyword
order.addIdProperty();
Property orderDate = order.addDateProperty("date").getProperty();
Property customerId = order.addLongProperty("customerId").notNull().getProperty();
order.addToOne(customer, customerId);
ToMany customerToOrders = customer.addToMany(order, customerId);
customerToOrders.setName("orders");
customerToOrders.orderAsc(orderDate);
}
các bạn để ý "customerToOrders.setName("orders");" . khi tạo xong thì đối tượng của Lớp Customer sẽ có 1 hàm là getorders() trả về danh sách các đối tượng Order có customerId =Customer .getID();
chạy Java project và ta sẽ thấy trong thư mục: C:/Users/hung/Documents/FriendBook/sampleAndroid/src-gen/de/greenrobot/daoexample các lớp đã được sinh ra gồm 8 lớp: Note.java,NoteDao.java,Order.java,OrderDao.java,Customer.java,CustomerDao.java,DaoMaster.java,DaoSession.java
Nếu đúng vậy là ok.
3.2 Thao tác với SQLite
1. tạo SQLite tên
DevOpenHelper openHelper = new DevOpenHelper(MainActivity.this,
"sample-db", null);
SQLiteDatabase db = openHelper.getWritableDatabase();
DaoMaster daoMaster = new DaoMaster(db);
//khởi tạo session để thực hiện thao tác với SQLite
DaoSession daoSession = daoMaster.newSession();
(Các bạn có thể tham khảo tại lớp MainActivity.java trong project DamExample ở đã download ở trên)
2. Cú pháp thực hiện thao tác với SQLite
2.1 Câu lệnh insert
- việc insert vào SQLite sẽ thực hiện theo đối tượng của các thực thể ví dụ:
// insert 10 bản ghi vào bảng Note
for (int i = 0; i < 10; i++) {
Note note = new Note(null, "hung" + i, "comment" + i);
daoSession.getNoteDao().insert(note);
}
//insert 2 bản gì vào bảng Customer
Customer custm = new Customer(null, "customer");
Customer custm2 = new Customer(null, "customer2");
daoSession.getCustomerDao().insert(custm);
daoSession.getCustomerDao().insert(custm2);
//insert 6 bản ghi vào bảng Order theo ID của đối tượng "custm" ở trên
for (int i = 0; i < 6; i++) {
Order order = new Order(null, new Date(), custm.getId());
daoSession.getOrderDao().insert(order);
}
//insert 6 bản ghi vào bảng Order theo ID của đối tượng "custm2" ở trên
for (int i = 0; i < 9; i++) {
Order order = new Order(null, new Date(), custm2.getId());
daoSession.getOrderDao().insert(order);
}
Chú ý: Chúng ta cũng có thể insert trực tiếp bằng câu lệnh : daoSession.insert(entity) ,daoSession.delete(entity),,daoSession.update(entity);
- Insert vào một bảng có quan hệ với nhat : ví dụ như khi insert thêm một bản ghi của Bảng order của đối tượng custm thì làm như sau:
// insert 1 bản ghi của bảng Order
//lấy list các Order của một customer (không cần thiết) mình lấy ra chỉ để so //sánh kết qủa trước và sau insert thôi.
List listOrderCus = customer.getOrders();
Order order = new Order(null, new Date(), customer.getID());
daoSession.insert(order);
// sau đó đến đấy bạn phải cập nhật lại listOrder
// nếu không listOrderCus của bạn giữ nguyên size không thay đổi
// cách 1
listOrderCus.add(order);
//cách 2
customer.resetOrders();
2.2 Câu lệnh Truy vấn
- Lấy tất cả các bản ghi trong 1 bảng
//lấy tất cả các bản ghi của một bảng
List listOrder = daoSession.getOrderDao().queryBuilder().build().list();
- Lấy tất cả các bản ghi trong một bản theo điều kiện
cách 1:
Query queryNote = daoSession.getNoteDao().queryBuilder()
.where(new StringCondition("_ID >5")).build();
List listNote = queryNote.list();
cách 2:
List listNote2 = daoSession.getNoteDao().queryBuilder().where(Properties.Id.gt(5)).list();
Riêng cách này thì bạn phải nhớ các hàm để thực hiện câu lệnh truy vấn:
eq(): so sánh bằng
notEq() :so sánh không bằng
like() : như SQL
in(): như SQL
gt(): lớn hơn
lt(): nhỏ hơn
ge(): lớn hơn hoặc bằng
le(): nhỏ hơn hoặc bằng
isNull() và isNotNull : giống SQL
các bạn có thể tham khảo thêm tại đây:
Property của greenDao
- Lấy tất cả các bản ghi trong các bảng có liên kết:
//tài liệu tham khảo, mình chưa test thử
Query query = userDao.queryBuilder().where(
new StringCondition("_ID IN " +
"(SELECT USER_ID FROM USER_MESSAGE WHERE READ_FLAG = 0)").build();
- Lấy các bản ghi trong bảng Order của một đối tượng Customer hoặc từ một đối tượng Order
// lấy tất cả các Order của một customer
List listOrderCus = customer.getOrders();
// lấy tất cả các Order của một order của customer
List listOrderCus =order.getCustomer().getOrders();
2.3 Câu lệnh Update
- update một bản ghi trong SQLite ví dụ bản ghi của bảng Note
// update
Note note= new Note();
note.setId(listNote.get(0).getId());
note.setText("tran hung deptrai");
noteDao.update(note);
//trong đó listNote là danh sách tất cả các bản ghi trong bảng Note
// mà mình đã lấy ra trước đó
- update một bản ghi của một bảng có quan hê ví dụ như update một bản ghi của bảng Order (tương tự như khi insert):
Sau khi update sau các bạn nhớ thực hiện:
2.4 Câu lệnh Delete
- Delete một bản ghi trong một bảng
// delete
Note note= new Note(listNote.get(0).getId());
daoSession.getNoteDao().delete(note);
//hoặc delete theo ID
daoSession.getNoteDao().deleteByKey(id);
- Delete một bản ghi có quan hệ 1-1 ví dụ như delete một bản ghi của bảng Order (giống insert) khi thực hiện xong nhớ
listOrderCus.remove(order);
//hoặc
customer.resetOrders();
-Delete một bản ghi có quan hệ 1-n ví dụ
// delete Customer
Customer customer = listCustomer.get(0);
for (int i = 0; i < customer.getOrders().size(); i++) {
daoSession.delete(customer.getOrders().get(i));
}
daoSession.delete(customer);
Không biết có câu lệnh delete các bản ghi của bảng Order khi delete một bản ghi của Customer hay không? Cái này mình không biết nên làm thủ công. :D
sau khi làm xong nhớ close lại nhé.
daoSession.clear();
db.close();
openhelper.close();
Rồi như vậy là xong.
Riêng mình thấy thao tác với greenDao rất là hay. :) Hy vọng các bạn thấy bổ ích