ปฏิบัติที่ดีที่สุด? - Array / Dictionary เป็นคุณสมบัติของคอร์ Data Entity [ปิด]


176

ฉันยังใหม่กับ Core Data ฉันสังเกตเห็นว่าประเภทคอลเลกชันไม่สามารถใช้งานได้เป็นประเภทแอททริบิวต์และต้องการทราบว่าวิธีที่มีประสิทธิภาพมากที่สุดในการจัดเก็บข้อมูลประเภทอาเรย์ / พจนานุกรมเป็นแอตทริบิวต์ (เช่นองค์ประกอบที่ประกอบขึ้นเป็นที่อยู่เช่นถนนเมือง ฯลฯ ) ไม่ต้องการเอนทิตีที่แยกต่างหากและจัดเก็บเป็นพจนานุกรม / อาร์เรย์ได้สะดวกกว่าแอททริบิวต์ / ฟิลด์ที่แยกต่างหาก) ขอบคุณ.


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

คำตอบ:


247

ไม่มีอาร์เรย์ "ประเภท" หรือประเภทพจนานุกรมในข้อมูลหลัก คุณสามารถจัดเก็บNSArrayหรือNSDictionaryเป็นคุณลักษณะที่เปลี่ยนแปลงได้ สิ่งนี้จะใช้ในNSCodingการทำให้เป็นลำดับอาร์เรย์หรือพจนานุกรมเพื่อNSDataแอตทริบิวต์ (และ deserialize เหมาะสมเมื่อเข้าถึง) ข้อดีของวิธีนี้คือมันง่าย ข้อเสียคือคุณไม่สามารถสืบค้นลงในอาร์เรย์หรือพจนานุกรม (เก็บไว้เป็น BLOB ในแหล่งข้อมูล) และถ้าคอลเลกชันมีขนาดใหญ่คุณอาจต้องย้ายข้อมูลจำนวนมากไปยัง / จากแหล่งข้อมูล (ถ้าเป็น ที่เก็บข้อมูล SQLite) เพื่ออ่านหรือแก้ไขส่วนเล็ก ๆ ของการรวบรวม

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

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

หากสิ่งนี้ฟังดูน่ากลัวเล็กน้อยก็เป็นได้ การนำเสนอข้อมูลตามอำเภอใจเข้าสู่เฟรมเวิร์กที่ขึ้นกับสคีเช่น Core Data นั้นยาก

สำหรับข้อมูลที่มีโครงสร้างเช่นที่อยู่จะเป็นการง่ายกว่าที่จะใช้เวลาในการสร้างแบบจำลองเอนทิตีอย่างชัดเจน (เช่นแอตทริบิวต์สำหรับแต่ละส่วนของที่อยู่) นอกจากการหลีกเลี่ยงรหัสพิเศษทั้งหมดในการสร้างแบบจำลองพจนานุกรมแล้วสิ่งนี้ทำให้ UI ของคุณง่ายขึ้น (การผูกจะ "ทำงานได้") และตรรกะการตรวจสอบของคุณเป็นต้นชัดเจนมากขึ้นเนื่องจาก Core Data สามารถจัดการได้มาก

ปรับปรุง

ตั้งแต่ OS X 10.7 ข้อมูลหลักจะมีประเภทชุดที่สั่งซื้อซึ่งสามารถใช้แทนอาร์เรย์ได้ หากคุณสามารถกำหนดเป้าหมาย 10.7 หรือใหม่กว่านี่เป็นทางออกที่ดีที่สุดสำหรับคอลเลกชันที่สั่งซื้อ (เหมือนอาร์เรย์)


Seconded - ยืนยันสิ่งที่ฉันคิดอยู่แล้ว แต่ไม่รู้เกี่ยวกับคุณลักษณะที่เปลี่ยนแปลงได้
jkp

3
@pixelfreak การใช้ transformable ขึ้นอยู่กับวิธีที่คุณต้องการใช้รายการในคอลเลกชัน หากคุณต้องการสอบถามกับพวกเขาหรือคุณต้องการที่จะสามารถโหลดบางส่วนหรือทั้งหมดของพวกเขาอย่างเงียบ ๆ คุณลักษณะที่เปลี่ยนแปลงได้จะไม่ทำงาน หากคุณไม่จำเป็นต้องโหลดอย่างเกียจคร้านไม่จำเป็นต้องสืบค้นและต้องการรายการทั้งหมดหรือไม่มีเลยแอตทริบิวต์ที่แปลงได้อาจเหมาะกับคุณ (และใช้งานได้ง่ายอย่างแน่นอน)
Barry Wark

3
สิ่งที่แบร์รี่กล่าวว่ามีการอธิบายในรายละเอียดเพิ่มเติมในหลักข้อมูล Programming Guide บทที่ไม่เป็นมาตรฐานแอตทริบิวต์แบบต่อเนื่อง
Palimondo

2
ข้อควรระวังเกี่ยวกับชุดที่ได้รับคำสั่ง: อย่าใช้มันสำหรับความสัมพันธ์แบบต่อเนื่องที่มีวัตถุมากกว่าสองพันรายการในหลาย ๆ ด้าน หากคุณทำเช่นนั้นการบันทึกอาจเริ่มใช้เวลานานจนบล็อกเธรด
Kirk van Gorkom

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

11

ฉันมีปัญหาที่คล้ายกัน ในกรณีของฉันฉันต้องการแมปชุดของสตริง ฉันทำตามคำแนะนำของ Barry และในที่สุดก็ทำให้มันใช้งานได้ นี่คือลักษณะของโค้ดบางอย่าง (ซึ่งหวังว่าจะทำให้ชัดเจนสำหรับทุกคนที่พบเจอ)

เอนทิตีของฉันมีลักษณะเช่นนี้:

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

โค้ดจัดการโมเดลตัวจำลองวัตถุ (ข้อมูลแกนหลัก) ของฉันมีลักษณะดังนี้:

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];

ดังนั้นรายการสำคัญที่นี่คือ:

  • ฉันกำลังใช้ NSSet สำหรับประเภทคุณสมบัติ
  • ฉันใช้ NSTransformableAttributeType เป็นประเภทแอตทริบิวต์ในโมเดลวัตถุของข้อมูลหลักที่จัดการ

ดังนั้นคุณจะใส่รหัสนี้ใน AppointmentSearchResponse.m ภายในวิธีการเริ่มต้นหรือไม่
Chicowitz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.