Praktek terbaik? - Array / Kamus sebagai Atribut Entitas Data Inti [ditutup]

176

Saya baru mengenal Core Data. Saya perhatikan bahwa tipe koleksi tidak tersedia sebagai tipe atribut dan ingin tahu apa cara yang paling efisien untuk menyimpan data tipe array / kamus sebagai atribut (mis. Elemen yang menyusun alamat seperti jalan, kota, dll. tidak memerlukan entitas terpisah dan lebih mudah disimpan sebagai kamus / larik daripada atribut / bidang terpisah). Terima kasih.

RunLoop
sumber
6
Membuat suatu entitas dengan bidang string untuk alamat mungkin lebih mudah untuk digunakan daripada kamus di mana Anda harus ingat kunci Anda ...
Daniel

Jawaban:

247

Tidak ada larik "asli" atau tipe kamus di Data Inti. Anda dapat menyimpan NSArrayatau NSDictionarysebagai atribut yang dapat ditransformasikan. Ini akan menggunakan NSCodinguntuk membuat serialisasi array atau kamus ke suatu NSDataatribut (dan membatalkan deserialisasi saat akses). Keuntungan dari pendekatan ini adalah mudah. Kelemahannya adalah Anda tidak dapat melakukan query ke dalam array atau kamus (disimpan sebagai BLOB di penyimpanan data) dan jika koleksinya besar, Anda mungkin harus memindahkan banyak data ke / dari penyimpanan data (jika itu adalah penyimpanan data SQLite) hanya untuk membaca atau memodifikasi sebagian kecil dari koleksi.

Alternatifnya adalah menggunakan Data Inti ke-banyak hubungan untuk memodelkan semantik array atau koleksi kamus. Array lebih mudah, jadi mari kita mulai dengan itu. Data inti ke-banyak hubungan benar-benar memodelkan suatu set, jadi jika Anda memerlukan fungsionalitas mirip array, Anda harus mengurutkan set tersebut (menggunakan properti yang diambil adalah cara yang mudah untuk melakukan ini) atau menambahkan atribut indeks tambahan ke entitas yang menyimpan item-item array dan mengelola indeks sendiri. Jika Anda menyimpan array yang homogen (semua entri adalah tipe yang sama), mudah untuk memodelkan deskripsi entitas untuk entitas array. Jika tidak, Anda harus memutuskan apakah akan menggunakan atribut yang dapat ditransformasikan untuk menyimpan data item atau membuat kumpulan entitas item.

Memodelkan sebuah kamus kemungkinan akan membutuhkan hubungan ke-banyak dengan sekumpulan entitas yang menyimpan kunci dan nilai. Kedua kunci dan nilai analog dengan entitas item untuk array, dijelaskan di atas. Jadi mereka bisa berupa tipe asli (jika Anda tahu mereka sebelumnya), atribut yang dapat ditransformasikan atau hubungan ke sebuah instance dari keluarga entitas tipe-spesifik.

Jika ini semua terdengar agak menakutkan, itu benar. Memilih data sewenang-wenang ke dalam kerangka kerja yang bergantung pada skema seperti Core Data itu sulit.

Untuk data terstruktur, seperti alamat, hampir selalu lebih mudah untuk menghabiskan waktu memodelkan entitas secara eksplisit (misalnya atribut untuk setiap bagian dari alamat). Selain menghindari semua kode tambahan untuk memodelkan kamus, ini membuat UI Anda lebih mudah (binding akan "berfungsi") dan logika validasi Anda dll. Jauh lebih jelas karena banyak yang dapat ditangani oleh Core Data.

Memperbarui

Pada OS X 10.7, Core Data mencakup tipe set yang dipesan yang dapat digunakan sebagai pengganti array. Jika Anda dapat menargetkan 10.7 atau lebih baru, ini adalah solusi terbaik untuk koleksi yang dipesan (seperti array).

Barry Wark
sumber
Diperbanyak - mengkonfirmasi apa yang sudah saya pikirkan tetapi saya tidak tahu tentang atribut yang dapat ditransformasikan.
jkp
3
@pixelfreak Penggunaan transformable tergantung pada bagaimana Anda perlu menggunakan item dalam koleksi. Jika Anda perlu menanyakannya, atau Anda ingin dapat memuat beberapa atau semuanya dengan malas, atribut yang dapat ditransformasikan tidak akan berfungsi. Jika Anda tidak perlu memuat malas, tidak perlu kueri dan selalu membutuhkan semua item atau tidak sama sekali, atribut yang dapat ditransformasikan dapat bekerja untuk Anda (dan tentu saja mudah diimplementasikan).
Barry Wark
3
Apa yang dikatakan Barry dijelaskan lebih terinci dalam Panduan Pemrograman Data Inti, bab Atribut Persisten Non-Standar .
Palimondo
2
Catatan kehati-hatian tentang set yang dipesan: jangan menggunakannya untuk hubungan banyak-dengan lebih dari beberapa ribu objek di banyak sisi. Jika Anda melakukannya, menabung dapat mulai memakan waktu lama sehingga memblokir utas.
Kirk van Gorkom
2
Saya tidak mengerti tentang "set pesanan baru". Apakah ini atribut? Karena saya tidak bisa melihatnya di menu tipe atribut.
Plot
11

Saya punya masalah serupa. Dalam kasus saya, saya ingin memetakan array string. Saya mengikuti saran Barry dan akhirnya berhasil. Berikut adalah beberapa kode yang terlihat (yang diharapkan akan mengklarifikasi hal-hal untuk orang lain yang mengalami ini) ...

Entitas Saya terlihat seperti ini:

@interface AppointmentSearchResponse : NSManagedObject
@property (nonatomic, retain) NSSet *messages;
@end

Kode My Manage Object Model Code (Core Data) terlihat seperti ini:

NSEntityDescription *entityDescription = [[NSEntityDescription alloc] init];
[entityDescription setName:@"AppointmentSearchResponse"];
[entityDescription setManagedObjectClassName:@"AppointmentSearchResponse"];

NSMutableArray *appointmentSearchResponseProperties = [NSMutableArray array];
NSAttributeDescription *messageType = [[NSAttributeDescription alloc] init];    
[messageType setName:@"messages"];
[messageType setAttributeType:NSTransformableAttributeType];
[appointmentSearchResponseProperties addObject:messageType];

[entityDescription setProperties:appointmentSearchResponseProperties];

Jadi item utama di sini adalah:

  • Saya menggunakan NSSet untuk tipe properti
  • Saya menggunakan NSTransformableAttributeType sebagai tipe atribut dalam Core Data Managed Object Model.
caleb
sumber
Jadi, apakah Anda akan meletakkan kode ini di dalam AppointmentSearchResponse.m dalam metode init?
Chicowitz