ขั้นตอนการใช้งาน greenDAO บน Android (ภาคล่าสุด)
บทความนี้เป็นบทความ rewrite จากบทความเก่านะครับ Day 19 : GreenDAO เนื่องจากว่าบทความค่อนข้างเก่า และทำในซีรีย์ Learn 30 Android Libraries in 30 Days ซึ่งก็บอกอยู่แล้วว่าใช้เวลาศึกษาแค่วันเดียว ฉะนั้นก็อาจจะมีผิดพลาดบ้าง บทความนี้ผมก็เลยถือโอกาสอัพเดท ให้มันล่าสุด โดยลองรับกับ Android Studio เวอร์ชัน 1.1 (เพิ่งอัพเดทวันนี้)
โดยที่ผมเขียนวันนี้ ก็อ้างอิงจากบทความเก่านะ ทำเฉพาะส่วนที่ add library และ generator ส่วนโค๊ด การใช้งาน ORM เหมือนเดิมจากบทความเก่าทุกอย่าง :D
greenDAO คืออะไร?
greenDAO เป็น Open Source Project ที่ช่วยการทำงานร่วมกับ SQLite ในการ CRUD (CREATE, READ, UPDATE, DELETE) ทำได้ง่ายมากครับ โดยผ่าน ORM (Object Relational Model) คือใช้คลาส Java ของเรา mapping กับ model ของฐานข้อมูล SQLite โดยมี Dao Interface เป็นตัวเชื่อมต่ออีกที เช่นใน Java เรามีคลาส Person
มี name
และ age
เราก็ใช้แค่ setName()
, setAge()
แล้วก็เซฟลงฐานข้อมูลโดยใช้ Dao Interface ก็ได้เลย ไม่ต้องมาเสียเวลาโยน ContentValues
แบบ pure SQLite แล้วไอ้เจ้า ORM มันคืออะไร? หลายคนคงจะสงสัย ไปหาอ่านเพิ่มเติมกันเองนะครับ ORM คืออะไร?
greenDAO library Overview
การติดตั้ง greenDAO จะมีด้วยกัน 2 ตัวนะครับ นั่นก็คือ
de.greenrobot:greendao:1.3.7
: เป็น Library ของ GreenDAO ธรรมดาde.greenrobot:DaoGenerator:1.3.0
: จะเป็นตัวเอาไว้ Generate ให้กลายเป็น ORM ให้เรานะครับ Library ของ Gradle คือ
โดยขั้นตอนการใช้งานของ greenDAO คือ
- ทำการสร้างโมดูล
daoGenerator
ขึ้นมา - สร้างคลาสโมเดลต้นแบบของเราขึ้นมา
- ใช้
daoGenerator
ทำการแปลงโมเดลของเรา ให้อยู่ในรูปแบบ ORM พร้อมใช้งาน - เพิ่ม library ของ greenDAO (คนละตัวกับ greenDAO Generator)
- นำ ORM ของเราไปใช้งานได้ Insert/Update/Delete สบายๆ ~~
Step 1 : สร้าง daoGenerator
ขั้นตอนแรก ทำการสร้าง daogenerator
ขึ้นมา (ผมใช้ตัวพิมพ์เล็กทั้งหมดนะครับ กันสับสนกับตัวต้นแบบ) โดยเปิดไปที่ File => New Module จากนั้นเลือก Java Library
- Library name : ใส่ชื่อโมดูลของเรา
- java package name: ใส่ชื่อ package name ของโมดูล
- java class name : ใส่ชื่อคลาสหลัก ที่จะเอาไว้ทำโมเดลต้นแบบ
เมื่อทำการสร้างโมดูลเสร็จ จะเห็นว่ามีโมดูลใหม่เพิ่มขึ้นมาในโปรเจ็คแล้ว
หากดูในมุมมอง Android จะเห็นแบบนี้
หากดูในมุมมอง Project ก็จะเห็นแบบนี้
ต่อมาเปิดไฟล์ build.gradle
ในโมดูล daogenerator
ขึ้นมา แล้วแก้ไขไฟล์เป็นแบบนี้
อธิบายโค๊ดด้านบน
mainClassName
: เป็นคลาสที่เราจะทำการ generate ก็คือคลาสต้นแบบของโมเดลของเรา (ตอนนี้คลาสนี้ยังไม่ได้สร้าง แต่ว่าประกาศใช้แบบนี้ไปก่อน โดยสิ่งที่ต้องเปลี่ยนไม่ให้เหมือนผมคือ package name ส่วนMyDaoGenerator
จะใช้ชื่อเดียวกันก็ได้outputDir
: เป็น path ของ folder ที่เราจะให้ generate ไป ตัวอย่างคือจะ gen ไปที่โมดูลapp/src/main/java-gen
ครับapp
คือชื่อโมดูลแรกเวลาสร้างโปรเจ็ค Android หากใครเป็นชื่ออื่นก็เปลี่ยนตามด้วยrun()
: เป็น gradle script เอาไว้สั่งรัน โดยมี argument เป็นoutputDir
ที่ประกาศไว้
Step 2 : Create Generator Class
ต่อมาถึงคิวที่ต้องสร้างตัวคลาส Generator แล้ว โดยการสร้างคลาสขึ้นมาใหม่ ยังอยู่ในโมดูล daogenerator
ผมทำการตั้งชื่อว่า MyDaoGenerator
Note: ดูด้วยว่า import package ของ
Schema
และEntity
ถูกต้องหรือไม่?
โค๊ดด้านบน ผมทำการสร้าง Schema ขึ้นมา เป็นเหมือนการสร้าง Database ขึ้นมาก้อนนึง ชื่อว่า com.devahoy.daogenerator
และเป็นเวอร์ชัน 1 หากคุณเคยเขียน SQLiteOpenHelper
มาก่อน จะคุ้นกับการสร้าง constructor แบบนี้
ต่อมาผมสร้าง Entity ที่ชื่อว่า Player
ส่วนนี้โค๊ดจะถูก generate ไปเป็นคลาส Player
และ PlayerDAO
สุดท้ายสั่งรันสคริป Gradle เพื่อให้มัน generator โดยกดที่แท็ป Gradle อยู่ขวามือๆ แล้วมองหา :DaoGenerator แล้วดับเบิลคลิกที่ script run จะได้ดังภาพ
หรือทำผ่าน Terminal ของ Android Studio โดย change directory ไปที่โมดูล daogenerator
แล้วสั่งรันสคริป run()
จะได้ผลลัพธ์ลักษณะนี้ มีคลาส 4 ตัวที่ถูกสร้างขึ้นในโมดูล app
โมดูลหลักของเรา
Step 3 : เพิ่ม Library greenDAO
ตรงส่วน greenDao Generator เรียบร้อยแล้ว ต่อมาจะเป็นตัว core ของ greenDAO กันบ้าง โดยการเพิ่ม library ผ่าน gradle ง่ายๆ ด้วยการเปิด build.gradle
ในโมดูล app
แบบนี้
ถัดมาทำการ setup SourceSets ด้วยครับ เนื่องจาก default มันรู้จักแค่ src/main/java
ไม่ได้รู้จักโฟลเดอร์ src/main/java-gen
ที่เราทำการสร้างมาใหม่ ต้องไปบอกให้มันรู้ครับ โดยเพิ่มโค๊ดไปใน block android ดังนี้
ทำการกด Sync Now 1 ที สุดท้ายไฟล์ build.gradle
ในโมดูล app
จะเป็นแบบนี้
ส่วนอื่นๆ เริ่มทำตาม Step 5 ของบทความเก่าได้เลยครับ (มีการเพิ่ม Schema ขึ้นมาเล็กน้อย) Day 19 : GreenDAO
Workshop
จริงๆแล้วบทความถ้า จำมือทำไปเลย คนที่ได้ประโยชน์ที่สุดคงเป็นแค่ผมคนเดียวละมั้ง เพราะได้คิดเอง ได้ทำเอง ประยุกต์เอง ส่วนคนอ่าน ก็แค่อ่าน แล้วทำตาม สิ่งที่ได้คุณได้โปรเจ็คจริงๆ นั่นแหละ แต่บางคนเข้าใจไหมที่ทำตามคืออะไรบ้าง ฉะนั้นผมเลยฝาก workshop เล็กๆน้อยๆ ให้ไปทำเพิ่มเติมดูครับ ไม่ทำไม่เป็นไร ไม่ได้มีผลกระทบอะไรกับผมอยู่แล้ว แต่ถ้าทำ มันจะมีประโยชน์แก่ตัวผู้ทำเองครับ :D
-
จากบทความเก่า Schema มีแค่
name
กับclub
แต่อันใหม่มีage
และnationality
เพิ่มขึ้นมา คุณสามารถประยุกต์ใช้ได้หรือไม่? -
เปลี่ยนจาก
ArrayAdapter
เป็น Custom Adapter ได้หรือไม่? -
ไม่อยากเพิ่มข้อมูลในโปรแกรมอะ ทำหน้า AddData เพิ่มขึ้นมา เพื่อเอาไว้ใส่ข้อมูล
-
อยากให้มีปุ่ม Add เพิ่มเข้าไปบน Menu เพื่อเปิดหน้า AddData หรือจะทำ floating button แบบ Lollipop ดี :D
-
อยากแก้ไขข้อมูลทำไงดี? เพิ่มปุ่ม Edit โดยเปิดไปหน้า AddData นั่นแหละ แต่ส่งข้อมูลเก่าไปด้วย
-
อยากให้ลบข้อมูลได้ด้วย โดยเมื่อคลิกที่ ListView ค้างไว้ จะมี Dialog ขึ้นมาให้ยืนยันว่าจะลบหรือไม่
จริงๆมันก็เกี่ยวกับฐานข้อมูล SQLite ฉะนั้นถ้าหากว่าอ่านบทความ 2 บทความนี้ประกอบ และเข้าใจ ทำได้แน่นอนครับ
Happy Coding ❤️
- Authors
-
Chai Phonbopit
เป็น Web Dev ในบริษัทแห่งหนึ่ง ทำงานมา 10 ปีกว่าๆ ด้วยภาษาและเทคโนโลยี เช่น JavaScript, Node.js, React, Vue และปัจจุบันกำลังสนใจในเรื่องของ Blockchain และ Crypto กำลังหัดเรียนภาษา Rust