Core Data การลบวัตถุ

ฉันกำลังดำเนินการเพิ่มข้อมูลหลักลงในแอป iPad ของฉัน ขั้นตอนทั่วไปของฉันคือการทดสอบโค้ดโดยใส่ไว้ในตัวแทนแอป เมื่อฉันพอใจที่ได้แยกวิเคราะห์โค้ดอย่างถูกต้องแล้ว ฉันจะย้ายรหัสไปยังวิธีที่เหมาะสมในที่อื่นในแอป จนถึงตอนนี้สิ่งนี้ได้ผลกับการเพิ่มวัตถุ แต่ฉันมีปัญหาในการลบวัตถุ ฉันสามารถลบพวกมันออกจากตัวแทนของแอพได้โดยการเลือกพวกมันแล้วลบทิ้ง และตอนนี้ฉันกำลังลบมันทั้งหมดเมื่อแอพเริ่มทำงานเพียงเพื่อรักษาฐานข้อมูลให้สะอาดจนกว่าโค้ดข้อมูลหลักจะทำงานได้

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

ฉันมีสองชั้น ให้ฉันเรียกพวกเขาว่า Car และ Tire เพื่อประโยชน์ในการสนทนานี้ ฉันไม่รู้ว่าแบบแผนคืออะไร ดังนั้นฉันจึงคิดขึ้นมาเอง นั่นคือการเพิ่ม C_ ที่จุดเริ่มต้นของชื่อสำหรับออบเจ็กต์ Core Data ที่เกี่ยวข้องเพื่อจัดเก็บออบเจ็กต์ที่เกี่ยวข้องกับออบเจ็กต์เหล่านี้ ฉันมีคลาสเพิ่มเติมอีกสองคลาส C_Car และ C_Tire รถแต่ละคันสามารถมียางได้หลายเส้น ดังนั้น Car จึงมีคุณสมบัติ tires ซึ่งเท่ากับ NSSet ของ Tire * นอกจากนี้ Car มีคุณสมบัติที่เรียกว่า CarCD ประเภท C_Car * และ Tire มีคุณสมบัติที่เรียกว่า TireCD ประเภท C_Tire * เพื่อให้แต่ละออบเจ็กต์สามารถติดตามออบเจ็กต์ข้อมูลหลักที่เกี่ยวข้องได้ (CD ใช้สำหรับข้อมูลหลัก)

Xcode สร้างวิธีการที่สะดวกสบายในการเพิ่มหรือลบวัตถุ หนึ่งในนั้นคือวิธีการเติมยางให้กับรถยนต์ ฉันใช้สิ่งนั้นดังนี้:

tire.tireCD = tireCD; //tire is an object of type Tire *, and tireCD is an object of type C_Tire *.
[self.carCD addTireObject:tireCD];//self.carCD is a property in my view controller of type CarCD *, and tireCD is a local object of type TireCD *.

นอกจากนี้ยังมีวิธีที่สะดวกในการถอดยางออกจากรถ - (void)removeTireObject:(C_Tire *)value; ฉันคิดว่าทุกที่ในตัวควบคุมมุมมองของฉันที่ฉันมี:

[tireObject removeFromSuperview];//tireObject is a (Tire *) object.

ฉันจะเปลี่ยนสิ่งนั้นเป็น:

[carObject removeTireObject:tireObject.tireCD];
[tireObject removeFromSuperview];

บรรทัดแรกควรลบวัตถุออกจาก NSSet บนวัตถุข้อมูลหลัก บรรทัดที่สองจะลบวัตถุออกจากวัตถุรถยนต์ที่ใช้ในแอพ

ปัญหาคือ ฉันไม่เห็น SQL ใด ๆ ที่ถูกสร้างขึ้นในหน้าต่างดีบักเกอร์เมื่อมีการเรียกใช้โค้ดนี้ ฉันพลาดอะไรไปรึเปล่า?

นอกจากนี้ หากคุณต้องการแสดงความคิดเห็นเกี่ยวกับแบบแผนการตั้งชื่อ ตอนนี้ก็ถึงเวลาที่ฉันจะยอมรับสิ่งที่เป็นแบบแผน


person Victor Engel    schedule 29.06.2013    source แหล่งที่มา
comment
เมื่อใช้ po เพื่อสอบถามวัตถุ CarCD ฉันเห็นว่าการลบเกิดขึ้นจริง ฉันคิดว่าข้อผิดพลาดของฉันคือฉันไม่ได้ลบวัตถุ TireCD เพียงลบการอ้างอิงออกจากวัตถุ CarCD เท่านั้น   -  person Victor Engel    schedule 29.06.2013
comment
ฉันไม่เข้าใจว่าทำไมคุณถึงมีคลาส 2 ชุด (Car/Tire และ C_Car/C_Tire) คลาสย่อยของอ็อบเจ็กต์ที่ได้รับการจัดการหนึ่งคลาสสำหรับแต่ละเอนทิตีควรจะเพียงพอ   -  person Martin R    schedule 29.06.2013
comment
ไม่จำเป็นต้องบันทึกคุณสมบัติของรถยนต์และยางรถยนต์ทั้งหมดลงในข้อมูลหลัก C_Care และ C_Tire มีเพียงคุณสมบัติที่จำเป็นในการบันทึกเท่านั้น คุณสมบัติอื่นๆ ของ Car and Tyre เป็นสิ่งจำเป็นในแอป แต่ไม่ใช่ข้อมูลหลัก ฉันหวังว่ามันจะสมเหตุสมผล   -  person Victor Engel    schedule 29.06.2013
comment
ป.ล. หนึ่งคือ NSMagagedObject อีกอันไม่ได้   -  person Victor Engel    schedule 29.06.2013
comment
และรถยนต์/ยางรถยนต์เป็นของ UIView หรือไม่ ยางเป็นมุมมองย่อยของรถยนต์?   -  person Martin R    schedule 29.06.2013
comment
โปรดทราบว่าคุณจะเห็นคำสั่ง SQLite เฉพาะเมื่อบริบทของวัตถุที่ได้รับการจัดการ บันทึก   -  person Martin R    schedule 29.06.2013
comment
@MartinR ฉันตระหนักดีว่า ปัญหาของฉันคือฉันกำลังลบการอ้างอิงออกจาก NSSet แต่ไม่ได้ลบวัตถุ ฉันเพิ่มการเรียก [context DeleteObject:] และทำงานได้ตามที่คาดไว้ แค่การกำกับดูแลที่โง่เขลา   -  person Victor Engel    schedule 29.06.2013
comment
ใช่ Car and Tire เป็นคลาสย่อยของ UIView และ Tyre เป็นมุมมองย่อยของ Car   -  person Victor Engel    schedule 29.06.2013
comment
ดังนั้นปัญหาของคุณได้รับการแก้ไขแล้วหรือมีคำถามเหลืออยู่หรือไม่? - (อย่างไรก็ตาม โปรดทราบว่า deleteObject:tire จะถอดยางออกจากวัตถุของรถโดยอัตโนมัติ หากตั้งค่ากฎการลบข้อมูลหลักเป็น Nullify)   -  person Martin R    schedule 29.06.2013
comment
ฉันกำลังลบวัตถุ C_Tire ดูเหมือนว่าข้อมูลหลักจะลบการอ้างอิงถึงข้อมูลดังกล่าวใน C_Car โดยอัตโนมัติ ดังนั้นฉันจึงสามารถละเว้นการเรียกใช้วิธีอำนวยความสะดวก [carObject removeTireObject:tireObject.tireCD]; ได้   -  person Victor Engel    schedule 29.06.2013
comment
ใช่ หากกฎการลบสำหรับความสัมพันธ์จาก C_Tire ถึง C_Car ถูกตั้งค่าเป็น Nullify   -  person Martin R    schedule 29.06.2013
comment
ใช่. แก้ไขปัญหา. ปัญหาเดียวที่เหลืออยู่คือการตั้งชื่อแบบแผนสำหรับเอนทิตีข้อมูลหลัก มีประชุมมั้ย?   -  person Victor Engel    schedule 29.06.2013


คำตอบ (1)


(นี่คือบทสรุปจากความคิดเห็นด้านบนพร้อมข้อสังเกตเพิ่มเติมบางส่วน)

  • [car removeTireObject:tire] แค่ถอดยางออกจากรถ แต่ไม่ได้ลบวัตถุยาง หากต้องการลบวัตถุ ให้โทร [context deleteObject:tire]
  • การลบยางจะเป็นการลบยางออกจากรถที่เกี่ยวข้องโดยอัตโนมัติ หากตั้งค่า "ลบกฎ" สำหรับความสัมพันธ์จาก C_Tire ถึง C_Car เป็น "Nullify"
  • การเปลี่ยนแปลงข้อมูลหลักจะถูกเขียนลงดิสก์เฉพาะในกรณีที่บริบท บันทึก เท่านั้น จากนั้นคุณจะเห็นเอาต์พุตการดีบัก SQLite

สำหรับแบบแผนการตั้งชื่อ โปรดดูที่ "Conventions" ใน "การเขียนโปรแกรมด้วย Objective-C" ข้อสังเกตบางประการ:

  • การใช้ขีดล่างในชื่อคลาสนั้นผิดปกติ (อย่างที่คิด) ชื่อคลาสที่ดีกว่าสำหรับคลาสอ็อบเจ็กต์ที่ได้รับการจัดการอาจเป็น CDCar, CDTire หรือ หากคุณทำตามคำแนะนำเพื่อใช้คำนำหน้าตัวอักษรสามตัว XYZCar, XYZTire โดยที่ XYZ คือคำนำหน้าบางส่วนที่คุณเลือก
  • ฉันจะใช้ CarView, TireView สำหรับคลาสย่อย UIView
person Martin R    schedule 29.06.2013