การโยกย้าย IOS DBAccess ไปยังโครงสร้างตารางใหม่

ฉันกำลังอ่านเอกสาร DBAccess เพื่อทำความเข้าใจว่าสามารถตอบสนองความต้องการของฉันได้หรือไม่

คำถามของฉันเกี่ยวกับการโยกย้าย

ตัวอย่างเช่น: ฉันมีแอปที่มีอยู่ ซึ่งใช้งานกับ DBAccess โดยใช้ตาราง "บุคคล" พร้อมด้วยฟิลด์ต่อไปนี้:
- id
- ชื่อ
- นามสกุล
- ที่อยู่

จะเกิดอะไรขึ้นกับฐานข้อมูลถ้าฉันเพิ่มอีกสองฟิลด์ในคลาสบุคคล:
- อีเมล
- phone_number
?
DBAccess จะเพิ่มฟิลด์ใหม่ลงในตารางฐานข้อมูลโดยอัตโนมัติหรือไม่
มีวิธีระบุหรือไม่ ค่าเริ่มต้นสำหรับฟิลด์ที่เพิ่มใหม่?


person Patrik    schedule 14.04.2015    source แหล่งที่มา


คำตอบ (1)


ใช่ หากคุณเพิ่มคุณสมบัติเพิ่มเติมทั้งสองนั้น DBAccess จะเพิ่มคอลัมน์เพิ่มเติมโดยอัตโนมัติ

ในปัจจุบัน ไม่มีความสามารถในการระบุค่าเริ่มต้นสำหรับคอลัมน์ใหม่ คอลัมน์ทั้งหมดจะเริ่มต้นด้วย NULL ตามที่คุณคาดหวัง

คำแนะนำของคุณเกี่ยวกับค่าเริ่มต้นนั้นน่าสนใจ ฉันแปลกใจที่ไม่เคยมีมาก่อน ดูเหมือนว่าทั้งใช้งานง่ายและค่อนข้างเป็นคุณลักษณะเชิงตรรกะ สิ่งเดียวที่แปลกเล็กๆ น้อยๆ ก็คือถ้าฉันเพิ่มวิธีการเข้าไป

+ (id)defaultValueForProperty:(NSString*)propertyName;

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

ฉันจะเพลิดเพลินกับข้อเสนอแนะของคุณว่าคุณรู้สึกว่าอะไรจะเป็นวิธีแก้ปัญหาที่เหมาะสม

โดยส่วนตัวแล้วฉันกำลังโน้มตัวไปที่ทั้งคลาสและวิธีอินสแตนซ์ และหากนักพัฒนาใช้วิธีอินสแตนซ์ ทุกแถวจะถูกแยกวิเคราะห์และเขียนใหม่ซึ่งอาจช้า แต่ก็เป็นคุณสมบัติที่มีประโยชน์มากเช่นกัน

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

ขอบคุณ

person Adrian_H    schedule 14.04.2015
comment
ฉันคิดว่าเมธอดคลาสจะมีประโยชน์มาก โดยเฉพาะอย่างยิ่งเมื่อเพิ่มฟิลด์ใหม่ (หรือการสร้าง) ที่ไม่สามารถเป็นค่าว่างได้ - person Patrik; 14.04.2015
comment
อย่างที่คุณพูด วิธีการอินสแตนซ์อาจช้ามากสำหรับตารางขนาดใหญ่ บางที อาจเป็นการดีกว่าถ้าจัดให้มีวิธีเรียกใช้แบบสอบถาม sql เพื่อแก้ไขข้อมูลที่มีอยู่ ซึ่งอาจจะเร็วกว่าก็ได้ หรือความเป็นไปได้ที่จะใช้ฟังก์ชันคลาสที่ถูกเรียกทุกครั้งที่มีการแก้ไขตาราง - person Patrik; 14.04.2015
comment
ฉันเข้าใจแล้ว ดังนั้นฉันเข้าใจเหตุผลของคุณที่อยู่เบื้องหลังสิ่งนี้คือการตั้งคำถามให้ประพฤติตน เช่น WHERE นามสกุล == '' หรือ นามสกุลเป็นโมฆะ เนื่องจากออบเจ็กต์ทั้งหมดจะมีค่าคุณสมบัติเริ่มต้น ตัวอย่างเช่น หากคุณต้องการเพิ่มอายุคอลัมน์ แม้ว่าค่าคอลัมน์ใน SQLite จะเป็น NULL ค่าในคลาสจะเป็น 0 เมื่อวัตถุนั้นยังคงอยู่ ก็จะถูกบันทึกด้วย 0 และไม่ใช่ NULL ฉันจะทำการเปลี่ยนแปลงเพราะมันง่าย แต่ฉันสงสัยว่ามีสถานการณ์อื่นที่ฉันควรคิดถึงที่ฉันยังไม่ได้พิจารณาหรือไม่ - person Adrian_H; 14.04.2015
comment
ขณะนี้เรากำลังใช้กลไกการอัปเกรด ถือเป็นปัญหาใหญ่ที่ต้องแก้ไข จริงๆ แล้ว เรามีระบบการแก้ไขอยู่ โดยที่เอนทิตีถูกเรียกพร้อมกับการแก้ไขปัจจุบัน และคุณจะต้องดำเนินการ SQL บางส่วนกับเอนทิตีดังกล่าว แต่มันทำลายลักษณะที่เข้มงวดของ DBAccess ฉันจะอธิบายจุดนั้นอย่างรวดเร็ว เราตรวจสอบความสมบูรณ์ของทุกคุณสมบัติที่ตั้งไว้ และเนื่องจากไม่มีวิธีใดที่จะทำลายความสมบูรณ์ได้โดยตรงด้วย DB (คุณก็ทำได้ แต่ไม่ได้ใช้เฟรมเวิร์ก) เราทราบดีว่าหากไม่มีข้อผิดพลาดร้ายแรงภายใน SQLite ความมุ่งมั่นรับประกันว่าจะประสบความสำเร็จ - person Adrian_H; 14.04.2015
comment
ฉันเข้าใจคำอธิบายของคุณ และฉันเห็นด้วยกับคุณเกี่ยวกับปัญหาความซื่อสัตย์ ฉันจะเริ่มใช้ DBAccess ในโครงการถัดไป คำตอบของคุณช่วยให้ฉันตัดสินใจได้ ดังนั้น... ขอบคุณสำหรับการสนับสนุน :) - person Patrik; 15.04.2015
comment
สวัสดี @Patrik v1.06.1 มีการเปลี่ยนแปลงที่กล่าวถึงข้างต้น มีการเปลี่ยนแปลงเล็กน้อยเนื่องจากเรารู้สึกว่าพจนานุกรมมีการใช้งานที่สะอาดยิ่งขึ้น นี่คือลิงค์ไปยังเอกสารและตัวอย่าง ขอบคุณเอเดรีย db-access.org/default-property-values - person Adrian_H; 15.04.2015