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
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");
- 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");
}
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);
}
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();
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);
}
- 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. ListlistOrderCus = 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();
- 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 ListlistOrder = daoSession.getOrderDao().queryBuilder().build().list();
cách 1:
Query queryNote = daoSession.getNoteDao().queryBuilder()
.where(new StringCondition("_ID >5")).build();
List listNote = queryNote.list();
ListlistNote2 = daoSession.getNoteDao().queryBuilder().where(Properties.Id.gt(5)).list();
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 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();
- 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 đó
Sau khi update sau các bạn nhớ thực hiện:
customer.resetOrders();
- 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);
listOrderCus.remove(order);
//hoặc
customer.resetOrders();
// 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);
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
hay phết
Trả lờiXóa