Objective-C Programming Chapter 17 (Part3)

School Project V.2

โปรแกรมที่ได้เขียนไปก็ทำงานได้ถูกต้อง แต่ถ้าหากเพิ่มเมธอดเข้าไปในคลาส Managed Object ที่ XCode สร้างให้เช่น เพิ่มเมธอด countStudent เข้าไปในคลาส Classroom เพื่อนับจำนวนนักเรียน แต่หลังจากที่เขียนโปรแกรมไปสักพัก ก็พบว่าต้องการจะแก้ไข model เช่น เพิ่มชื่อของอาจารย์ประจำชั้น ผลที่ตามมาจากการเปลี่ยนโมเดล คือคลาสที่เคยใช้ก็จะใช้ไม่ได้เพราะไม่เข้ากับโมเดลใหม่ที่สร้างขึ้น ดังนั้นจึงต้องให้ XCode สร้างคลาสให้ใหม่ การให้ XCode สร้างคลาสให้ใหม่นั้นไม่ใช่ปัญหา แต่สิ่งที่เป็นปัญหาคือเมธอดที่ได้เขียนเพิ่มเข้าไปก็จะหายไปด้วย เนื่องจากเราได้เขียนเมธอดการทำงานต่างๆไว้ในคลาสตัวเก่า เมื่อสร้างคลาสใหม่ XCode จะสร้างไฟล์ใหม่ทับของเดิม โค้ดที่ได้เขียนไปจึงหายไปด้วย การแก้ไขปัญหานี้อาจจะทำได้ด้วยการคัดลอกโค้ดไว้ก่อน แล้วนำไปวางในคลาสใหม่ แต่ถ้าหากเกิดแก้ไขพร้อมกันสัก 5 คลาส การใช้วิธี copy & paste ย่อมไม่ใช่หนทางที่ดีแน่นอน การแก้ปัญหาที่ดีกว่านั้นก็คือใช้แคทิกกอรี่ ดังเช่นตัวอย่างต่อไปนี้

Student+DataManagement.h

Student+DataManagement.m

จากโค้ดของแคทิกกอรี่ DataMagement ของ Student มีเมธอดทั้งหมด 2  เมธอดด้วยกัน โดยเมธอดแรกนี้เป็นเมธอดที่ใช้คำนวนเกรดของนักเรียน ส่วนเมธอดที่สองเป็นคลาสเมธอด เพื่อช่วยให้สร้างอ็อบเจ็กได้ง่ายขึ้น

Classroom+DataManagement.h

Classroom+DataManagement.m

สำหรับคลาส Classroom ก็เพิ่มแคทิกอรี่เพื่อใช้สร้างอ็อบเจ็กเช่นเดียวกันกับคลาส Student และนอกจากการเพิ่มแคทิกกอรี่แล้ว เราจะเพิ่มคลาส DataManagement เพื่ออำนวยความสะดวกในการสร้าง Core Data Stack มากขึ้น

DataManagement.h

DataManagement.m

เราได้ย้ายโค้ดการสร้าง store , coordinator , context และอ่านโมเดล มาไว้ในคลาส DataManagement เพื่อให้จัดการเตรียมทุกอย่างที่จำเป็นต่อการใช้ Core Data และในส่วนของโปรแกรมหลักมีโค้ดดังนี้

main.m

โปรแกรมที่ได้เขียนไปมีนักเรียนทั้งหมด 4 คน และมีห้องเรียนจำนวนสองห้อง เมื่อให้โปรแกรมทำงานก็จะได้ผลลัพธ์ดังนี้

Program 17.3 Output

Physic – Yaya Urassaya : A
Physic – Nadech Kugimiya : C
Biology – Mai Davika : B
Biology – Mario Maurer : C

เมื่อเปรียบเทียบโปรแกรมที่ได้ปรับปรุงไป ก็จะเห็นได้ว่าโปรแกรมเข้าใจได้ง่ายกว่า และถ้้าหากได้แก้ไข Model ก็จะไม่กระทบกับโค้ดที่ได้เขียนเพิ่มเข้าไป

Predicate

ในการใช้งานฐานข้อมูลเช่น SQLite หากต้องการแสดงข้อมูลตามเงื่อนที่ต้องการ เช่น กำหนดว่าแสดงข้อมูลเฉพาะนักเรียนที่ชื่อ Mario ก็จะอาจจะเขียน query แบบนี้

SELECT * FROM STUDENT WHERE name = “Mario”

แม้ว่า Core Data สามารถที่จะกำหนดให้จัดเก็บข้อมูลแบบ SQLite ได้ แต่ก็ไม่อาจจะใช้ SQL Query เพื่อกำหนดเงื่อนไขข้อมูลได้ อย่างไรก็ตามการใช้งาน Core Data ก็มีการกำหนดเงื่อนไขเพื่อแสดงข้อมูลได้แบบเดียวกันซึ่งเรียกว่า predicate การใช้ predicate นี้ไม่จำกัดเพียงแค่ Core Data เท่านั้น แต่ยังสามารถที่จะใช้กับ NSArray , NSSet เพื่อใช้เป็นตัวกรองข้อขูลที่ต้องการได้เช่นกัน การกำหนด predicate จะใช้คลาส NSPredicate พร้อมกับกำหนดเงื่อนไขที่ต้องการ เช่น ถ้าต้องการกำหนดเงื่อนไขแบบเดียวกันกับ SQL Query ที่ได้แสดงไปก็จะเขียนได้ดังนี้

หนังสือเล่มนี้ไม่อาจจะครอบคลุมการใช้งาน predicate ได้ทั้งหมด จึงขอยกตัวอย่างการใช้งานบางส่วนเพื่อให้ผู้อ่านได้เข้าใจหลักการเบื้องต้นของการใช้งาน และสามารถไปศึกษาต่อเพิ่มเติมได้ด้วยตัวเอง

 

Basic Operation
เงื่อนไขเปรียบเทียบ มากกว่า น้อยกว่า เท่ากัน สามารถใช้ opertator ปกติได้ เช่น >  ,  <  , !=  รวมไปถึงการใช้ && , || หรืออาจจะเขียน AND , OR , NOT ได้เช่นเดียวกัน นอกจากนี้จะมีเงื่อนไข BETWEEN เพื่อใช้กำหนดขอบเขตของค่าที่ต้องการ เช่น BETWEEN { 5 , 20} เป็นต้น

String Comparison
การเปรียบเทียบสตริงใน predicate มีเงื่อนไขดังนี้ BEGINEWITH , CONTAINS , ENDSWITH , LIKE และ MATCHES เช่น

และยังสามารถกำหนด case insensitive โดยการใช้ [c] ได้ เช่น

Aggregate Operation
การกำหนดจำนวนมี operator ให้ใช้งานดังนี้  ANY, SOME, ALL , NONE , IN เช่น

Array Operation
หากต้องการกำหนดเงื่อนไขของอาร์เรย์ สามารถใช้ array[index] โดยระบุตำแหน่งของอาร์เรย์ หรือ array[FIRST] เพื่อกำหนดเฉพาะตัวแรก ส่วนการกำหนดสมาชิกตัวสุดท้ายใช้ array[LAST] และสุดท้ายกำหนดขนาดของอาร์เรย์ได้ด้วย array[SIZE]

เพื่อความเข้าใจการใช้งาน predicate มากขึ้น จะปรับโปรแกรมที่ได้เขียนไปสักเล็กน้อย โดยเพิ่มเงื่อนไขใน NSFetchRequest ให้เลือกข้อมูลเฉพาะนักเรียนที่คะแนนมากกว่าหรือเท่ากับ 70 ขึ้นมาแสดง

Program Output

Yaya Urassaya : 87 (A)
Mai Davika : 75 (B)

ลองเขียน predicate ที่มีความซับซ้อนมากกว่านี้ เช่น เลือกนักเรียนเฉพาะห้องเรียน Biology ที่ชื่อมีตัวอักษร k หรือ K  ก็จะเขียน predicate ได้ดังนี้

Program Output

Yaya Urassaya : 87 (A)
Mai Davika : 75 (B)

Summary

บทนี้ได้แนะนำการใช้ฐานข้อมูลด้วย C API ของ SQite ที่สามารถใช้ได้ทั้ง iOS และ Mac OS X แต่อย่างไรก็ตามในปัจจุบันมีไลบราลี่จากภายนอกที่อำนวยความสะดวกให้ใช้มากมาย แนะนำผู้อ่านควรศึกษาเพิ่มเติม เข่น FMDB นอกเหนือจาก SQLite แล้วในบทนี้ยังได้เรียนรู้การใช้งาน Core Data ซึ่งเป็นเฟรมเวิร์คในการจัดการข้อมูลที่มีประสิทธิภาพสูงมาก การเลือกใช้ Core Data และ SQLite นั้นมีข้อดีและข้อเสียต่างกันไป เช่น หากต้องการจะเขียนโปรแกรมให้รองรับแพลตฟอร์มอื่นๆเช่น Android การใช้ SQLite นั้นดูจะเหมาะสมกว่า เพราะสามารถใช้ไฟล์ฐานข้อมูลเดียวกัน รวมถึงใช้ Query ร่วมกันได้ แต่ถ้าโปรแกรมทำงานเฉพาะ iOS อย่างเดียว การใช้ Core Data อาจจะเหมาะสมกว่าเพราะไม่ต้องไปเขียน SQL Query อีกทั้งมีเครื่องมือในการออกแบบข้อมูลที่ง่ายมาก และยังสามารถจัดเก็บข้อมูลในแบบอ็อบเจ็กได้เลยทันที ในขณะที่ SQLite ไม่สามารถทำได้ ข้อดีอีกอย่างของการใช้ Core Data คือรองรับ iCloud บริการการเก็บข้อมูลบนกลุ่มเมฆ ดัังนั้นการเลือกใช้วิธีการเก็บข้อมูลต้องพิจารณาตามความเหมาะสมของ Application ดังนั้นการเลือกใช้ก็ต้องพิจารณาตามความเหมาะสม

โหลด PDF file ไปอ่านได้ครับ

Source Download : github

3 thoughts on “Objective-C Programming Chapter 17 (Part3)”

  1. Mapping Model ขอบคุณมากครับพี่ เดี๋ยวลองดูค๊าบ 😉

    ปล. ชี้เป้า หากใครกำลังหาข้อมูลอยู่ครับ http://goo.gl/h6n2uo

  2. กำลังได้ใช้ core data เลยคับ ขอสอบถามนิดหนึ่งคับ คือถ้าตอนเราอัพเดทแอพ แล้วเพิ่ม entity กับ relation ใหม่เข้าไปกับอันเดิมที่มีอยู่ มันจะ crash คับ เท่าที่ลองดู เหมือนว่ามันต้องทำ mapping อะไรด้วยคับ ถึงจะทำงานได้

    ปล. เคยลองเพิ่ม attribute ใน entity เดิม แบบนี้ทำได้ไม่ยากเท่าไรคับ แต่ถ้าเป็นเพิ่ม entity ใหม่เลย พอจะชี้เป้าได้ไหมคับ

    ขอบคุณคับ 🙂

    1. ถ้าเพิ่ม attribute,relation คิดว่า Lightweight Migration ก็น่าจะได้
      แต่ถ้าเพิ่ม entity น่าจะต้องทำ mapping model นะ

Leave a Reply