Data Inti menghapus objek

Saya sedang dalam proses menambahkan data inti ke aplikasi iPad saya. Prosedur umum saya adalah menguji kode dengan memasukkannya ke dalam delegasi aplikasi. Ketika saya puas bahwa kode saya telah diuraikan dengan benar, saya memindahkannya ke metode yang sesuai di tempat lain di aplikasi. Sejauh ini cara ini berhasil dengan menambahkan objek. Tapi saya mengalami masalah saat menghapus objek. Saya dapat menghapusnya dengan baik dari delegasi aplikasi dengan memilih dan menghapusnya, dan saat ini saya menghapus semuanya saat aplikasi dimulai hanya untuk menjaga database tetap bersih sampai kode data inti berfungsi.

Cukup sekian alur kerja saya. Masalah yang saya alami sekarang adalah menghapus objek dari tempat yang sesuai. Mari kita lihat apakah saya dapat menjelaskan secara singkat pengaturan saya.

Saya memiliki dua kelas, sebut saja Car dan Tire demi diskusi ini. Saya tidak tahu apa konvensi itu, jadi saya membuat konvensi saya sendiri, yaitu menambahkan C_ di awal nama objek Data Inti terkait untuk menyimpan objek yang terkait dengan objek tersebut. Jadi saya punya dua kelas tambahan, C_Car dan C_Tire. Setiap mobil dapat mempunyai beberapa ban, sehingga Car mempunyai properti tires, yaitu NSSet dari Tire *. Selain itu Car memiliki properti bernama CarCD bertipe C_Car *, dan Tire memiliki properti bernama TireCD bertipe C_Tire * sehingga setiap objek dapat melacak objek data inti terkait (CD untuk data inti).

Xcode membangun metode kenyamanan untuk menambah atau menghapus objek. Diantaranya adalah cara menambahkan ban pada mobil. Saya menggunakannya sebagai berikut:

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 *.

Selain itu, ada cara praktis melepas ban dari mobil, - (void)removeTireObject:(C_Tire *)value;. Saya pikir di mana pun di pengontrol tampilan tempat saya memiliki:

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

Saya hanya akan mengubahnya menjadi:

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

Baris pertama harus menghapus objek dari NSSet pada objek data inti. Baris kedua menghapus objek dari objek mobil yang digunakan dalam aplikasi.

Masalahnya adalah, saya tidak melihat SQL apa pun dihasilkan di jendela debugger ketika kode ini dijalankan. Apakah saya melewatkan sesuatu?

Selain itu, jika Anda ingin mengomentari konvensi penamaan, sekaranglah saatnya bagi saya untuk mengadopsi apa pun yang konvensional.


person Victor Engel    schedule 29.06.2013    source sumber
comment
Menggunakan po untuk menanyakan objek CarCD, saya melihat penghapusan benar-benar terjadi. Menurut saya kesalahan saya adalah saya tidak menghapus objek TireCD, hanya menghapus referensinya dari objek CarCD.   -  person Victor Engel    schedule 29.06.2013
comment
Saya tidak mengerti mengapa Anda memiliki 2 set kelas (Mobil/Ban dan C_Car/C_Tire). Satu subkelas objek terkelola untuk setiap entitas sudah cukup.   -  person Martin R    schedule 29.06.2013
comment
Tidak semua properti Mobil dan Ban perlu disimpan ke data inti. C_Care dan C_Tire hanya berisi properti yang perlu disimpan. Properti Mobil dan Ban lainnya diperlukan dalam aplikasi tetapi bukan data inti. Saya harap itu masuk akal.   -  person Victor Engel    schedule 29.06.2013
comment
P.S. Salah satunya adalah NSMagagedObject. Yang lainnya tidak.   -  person Victor Engel    schedule 29.06.2013
comment
Dan Mobil/Ban adalah milik UIView? Ban adalah subview dari Mobil?   -  person Martin R    schedule 29.06.2013
comment
Perhatikan bahwa Anda akan melihat pernyataan SQLite hanya ketika konteks objek yang dikelola disimpan.   -  person Martin R    schedule 29.06.2013
comment
@MartinR, saya menyadarinya. Masalah saya adalah saya menghapus referensi dari NSSet tetapi tidak menghapus objeknya. Saya menambahkan panggilan [context deleteObject:] dan berfungsi seperti yang diharapkan. Hanya kekhilafan yang bodoh.   -  person Victor Engel    schedule 29.06.2013
comment
Ya, Mobil dan Ban adalah subkelas UIView, dan Ban adalah subview dari Mobil.   -  person Victor Engel    schedule 29.06.2013
comment
Jadi masalah Anda sudah terpecahkan atau masih ada pertanyaan lagi? - (Ngomong-ngomong, perhatikan bahwa deleteObject:tire akan secara otomatis melepas ban dari objek mobil jika Aturan Penghapusan Data Inti diatur ke Nullify.)   -  person Martin R    schedule 29.06.2013
comment
Saya menghapus objek C_Tire. Data inti sepertinya secara otomatis menghapus referensinya di C_Car, jadi saya bisa menghilangkan panggilan ke metode praktis [carObject removeTireObject:tireObject.tireCD];.   -  person Victor Engel    schedule 29.06.2013
comment
Ya, jika Aturan Hapus untuk hubungan dari C_Tire ke C_Car diatur ke Nullify.   -  person Martin R    schedule 29.06.2013
comment
Ya. Masalah terpecahkan. Satu-satunya masalah yang tersisa adalah konvensi penamaan untuk entitas data inti. Apakah ada konvensi?   -  person Victor Engel    schedule 29.06.2013


Jawaban (1)


(Ini adalah ringkasan dari komentar di atas ditambah beberapa komentar tambahan.)

  • [car removeTireObject:tire] hanya melepas ban dari mobil, tidak menghilangkan objek bannya. Untuk menghapus objek, panggil [context deleteObject:tire].
  • Menghapus ban akan secara otomatis menghapusnya dari mobil terkait jika "Aturan Hapus" untuk hubungan dari C_Tire ke C_Car diatur ke "Nullify".
  • Perubahan Data Inti hanya ditulis ke disk jika konteksnya disimpan, baru setelah itu Anda akan melihat keluaran debug SQLite.

Untuk konvensi penamaan, lihat "Conventions" dalam "Pemrograman dengan Objective-C". Beberapa komentar:

  • Menggunakan garis bawah pada nama kelas (menurut saya) tidak biasa. Nama kelas yang lebih baik untuk kelas objek terkelola mungkin CDCar, CDTire atau, jika Anda mengikuti saran untuk menggunakan awalan tiga huruf, XYZCar, XYZTire di mana XYZ adalah beberapa awalan yang Anda pilih.
  • Saya akan menggunakan CarView, TireView untuk UIView subkelas.
person Martin R    schedule 29.06.2013