Thursday 6 July 2017

แกน ข้อมูล Transformable Vs ไบนารี ตัวเลือก


ด้วยแอตทริบิวต์แบบไบนารีคุณสามารถอ่านและเขียนอินสแตนซ์ของ NSData ได้โดยตรง คุณสามารถอ่านและเขียนอินสแตนซ์ของคลาสที่สามารถแปลงเป็นและจาก NSData ได้ด้วยแอ็ตทริบิวต์ transformable ที่เก็บข้อมูลจริงจะเหมือนกับในแอตทริบิวต์ไบนารี แต่ข้อมูลหลักจะใช้ NSValueTransformer เพื่อแปลง NSData จากที่จำเป็น ตัวอย่างเช่นสมมติว่าออบเจ็กต์ที่ได้รับการจัดการของคุณมีแอ็ตทริบิวต์รูปภาพซึ่งจะสะดวกในการอ่านและเขียน UIImage โดยตรง ยกเว้น UIImage ไม่สามารถบันทึกข้อมูลหลักได้ แต่ UIImage สามารถแปลงเป็นและจาก NSData ดังนั้นถ้าคุณใช้แอตทริบิวต์ transformable คุณสามารถอ่านและเขียน UIImage ในขณะที่ยังเก็บข้อมูล NSData ไว้ในที่เก็บข้อมูล ตอบ 10 ม. ค. 13 เวลา 18:43 น. Tom ข้อมูลการเปลี่ยนแปลงจะเก็บรักษาพฤติกรรม NSData แบบเดียวกันเกี่ยวกับการจัดเก็บข้อมูลภายนอกหรือไม่ (แม้ว่าการเก็บข้อมูลภายนอกจะไม่ชัดเจนใน UI หรือจะเริ่มปรากฏขึ้นที่ Core Data Store) ไม่ได้ระบุอย่างแม่นยำว่าแอตทริบิวต์ transformable จะถูกบันทึกลงในบันทึกภายนอกหรือกฎที่จะใช้ คุณสามารถแบ่งปันประสบการณ์ของคุณได้มั้ย Tommie C. Sep 13 15 at 2:19 ฉันมีคำถามเหมือนกัน ไม่มีตัวเลือกดังกล่าวในประเภทแอตทริบิวต์ Transformable ที่จะจัดเก็บไว้ใน quotExternal Storagequot นี่เป็นค่าเริ่มต้นหรือเมื่อ ndash Marcin Kapusta 26 ก. พ. 16 เวลา 16: 02 เมื่อการบันทึก NSArray เป็นแอตทริบิวต์ Core Data Transformable วัตถุจะไม่สามารถเข้าถึงได้ในการดึงข้อมูลเอนทิตี้ของภายหลัง อย่างไรก็ตามสามารถเรียกค้นข้อมูลได้หลังจากนั้น สิ่งที่เกิดขึ้นฉันสามารถตั้งค่าและบันทึกข้อมูลเอนทิตีข้อมูลหลักและแอตทริบิวต์จากที่เดียวในแอป iOS ของฉันได้ จากนั้นฉันไปอ่านเอนทิตีที่บันทึกไว้ล่าสุด มีแอตทริบิวต์ทั้งหมดยกเว้น NSArray ที่สามารถเปลี่ยนแปลงได้ ด้วยเหตุผลบางอย่างอาร์เรย์แสดงเป็นว่างเปล่า (เมื่อพิมพ์ลงในล็อกดูเหมือนว่าเส้นทาง (n) หากแอปปิดและเปิดอีกครั้งแอตทริบิวต์จะว่างเปล่าไม่ได้ความคิดใด ๆ ที่ฉันเข้าใจว่าการประหยัด NSArray ไป แอตทริบิวต์ transformable ไม่ได้เป็นแนวทางที่ดีที่สุดคุณสามารถอธิบายได้ว่าเหตุใดจึงเกิดขึ้น NSArray เต็มไปด้วยวัตถุ CLLocation ไม่มีข้อผิดพลาดหรือคำเตือนใด ๆ ที่พิมพ์อยู่ในคอนโซลและไม่มีคำเตือนหรือข้อผิดพลาดใด ๆ ของผู้เรียบเรียงด้านล่างนี้คือ XCTest ที่ฉันเขียนขึ้น (ตามที่คาดไว้) ดังที่คุณเห็นด้านล่างนี่คือรูปแบบข้อมูลหลักที่มีการตั้งค่าใน Xcode แอตทริบิวต์ route ถูกเลือกไว้โปรดทราบว่าฉันได้ลองใช้ทั้งสองอย่างแล้ว และไม่มีคุณสมบัติชั่วคราวฉันจำเป็นต้องเพิ่ม Value Transformer Name อะไรคือรหัสการจัดการข้อมูลหลักเองมาจาก GitHub repo ของฉัน SSCoreDataManger (ซึ่งทำงานได้ดีกับความรู้ของฉัน) นี่คือวิธีการ saveNewRunWithDate: และด้านล่างคือ NSManage RunDataModel อินเทอร์เฟซ dObject: ในการใช้งานคุณสมบัติเหล่านี้ได้รับการตั้งค่าโดยใช้ dynamic แอ็ตทริบิวต์ entity transformable entity คือ entity ที่ส่งผ่านอินสแตนซ์ของ NSValueTransformer ชื่อของคลาส NSValueTransformer ที่ใช้สำหรับแอ็ตทริบิวต์เฉพาะถูกตั้งค่าไว้ในรูปแบบอ็อบเจ็กต์ที่มีการจัดการ เมื่อข้อมูลหลักเข้าถึงข้อมูลแอตทริบิวต์จะเรียกใช้ค่า NSValueTransformerTransformerForName: เพื่อรับอินสแตนซ์ของตัวแปลงค่า การใช้ตัวแปลงค่าดังกล่าว NSData ที่เก็บไว้ในเอนทิตีจะถูกแปลงเป็นค่าอ็อบเจ็กต์ที่เข้าถึงได้ผ่านคุณสมบัติของอินสแตนซ์ของออบเจ็กต์ที่มีการจัดการ คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ในส่วนคู่มือการเขียนโปรแกรมข้อมูลหลักส่วนข้อมูลแบบถาวรที่ไม่ได้มาตรฐานโดยค่าเริ่มต้นข้อมูลหลักจะใช้ตัวแปลงค่าที่ลงทะเบียนไว้สำหรับชื่อ NSKeyedUnarchiveFromDataTransformerName และใช้ในการแปลงแบบย้อนกลับ กรณีนี้จะเกิดขึ้นหากไม่มีการระบุชื่อหม้อแปลงค่าใด ๆ ในตัวแก้ไขรูปแบบข้อมูลหลักและโดยทั่วไปคือพฤติกรรมที่คุณต้องการ ถ้าคุณต้องการใช้ NSValueTransformer อื่นคุณต้องลงทะเบียนชื่อในแอปพลิเคชันของคุณโดยเรียก NSValueTransformer setValueTransformer: forName: และตั้งชื่อสตริงในตัวแก้ไขรูปแบบ (หรือในโค้ดซึ่งเป็นอีกเรื่องหนึ่ง) โปรดทราบว่าหม้อแปลงค่าที่คุณใช้จะต้องรองรับการแปลงทั้งด้านหน้าและด้านหลัง เครื่องแปลงค่าค่าเริ่มต้นสามารถเปลี่ยนวัตถุใด ๆ ที่สนับสนุนการจัดเก็บข้อมูลคีย์ลงใน NSData ในกรณีของคุณคุณมี NSArray (ที่จริง NSMutableArray ซึ่งไม่ดี) NSArray สนับสนุน NSCoding แต่เนื่องจากคอลเลคชันวัตถุที่บรรจุอยู่ภายในต้องสนับสนุนด้วยเช่นกันมิฉะนั้นจะไม่สามารถเก็บถาวรได้ โชคดีที่ CLLocation สนับสนุน NSSecureCoding ตัวแปรใหม่ของ NSCoding คุณสามารถทดสอบการแปลง NSArray ของ CLLocation โดยใช้ Core Datas transformer ได้อย่างง่ายดาย ตัวอย่างเช่นฉันขอแนะนำให้คุณเขียนการทดสอบเช่นนี้สำหรับแอตทริบิวต์ที่เปลี่ยนได้ ง่ายต่อการเปลี่ยนแปลงแอพพลิเคชันของคุณที่เข้ากันไม่ได้กับหม้อแปลงเริ่มต้น (เช่นการใส่วัตถุที่ไม่สนับสนุนการเก็บถาวรแบบคีย์) ใช้ชุดของการทดสอบเช่นนี้ฉันไม่สามารถทำซ้ำปัญหาใด ๆ กับการเก็บ NSArray ของ CLLocation s มีบางส่วนที่สำคัญมากในคำถามของคุณ: ด้วยเหตุผลบางอย่างอาร์เรย์จะปรากฏเป็นข้อมูลว่าง (เมื่อพิมพ์ลงในล็อกดูเหมือนว่าเส้นทาง (n) หากแอปปิดลงและเปิดอีกครั้งแอตทริบิวต์จะว่างเปล่า (อย่างน้อยในใบสมัครของคุณอาจไม่ใช่การทดสอบของคุณ) ข้อมูลจะถูกแปลงและนำไปใช้กับเอนทิตีในสโตร์เมื่อแอ็พพลิเคชันกำหนดค่าเส้นทางอาร์เรย์จะยังคงอยู่ในสโตร์ - เรารู้ นี้เนื่องจากในครั้งต่อไปที่มีการเปิดใช้งานข้อมูลจะปรากฏขึ้นโดยปกตินี้บ่งชี้ว่าปัญหาในโปรแกรมประยุกต์เมื่อสื่อสารการเปลี่ยนแปลงระหว่างบริบทจากรหัสที่คุณโพสต์ดูเหมือนว่าคุณกำลังใช้บริบทเดียวและเฉพาะจากหัวข้อหลัก - SSCoreDataManager singleton ของคุณจะทำงานได้ไม่ถูกต้องและใช้ชุดพังผืดที่ใช้งานร่วมกันแบบล้าสมัยในขณะเดียวกันมี SSCoreDataManager ที่ใช้งาน - performBlock: เพื่อเข้าถึง NSManagedObjectCo ntext performBlock: ควรใช้เฉพาะกับบริบทที่สร้างขึ้นโดยใช้ประเภทพ้องที่เป็นคิว บริบทที่ใช้ที่นี่ถูกสร้างขึ้นด้วย - init ที่เพิ่ง wraps - initWithConcurrencyType: และส่งค่า NSConfinementConcurrencyType ด้วยเหตุนี้คุณจึงมีปัญหาพร้อมกันใน singleton ซึ่งน่าจะก่อให้เกิดพฤติกรรมบางอย่างที่คุณเห็น คุณยังคงยืนยันค่าแอตทริบิวต์กับเอนทิตี แต่ต่อมาไม่เห็นค่าดังกล่าวสะท้อนขึ้นเมื่อพร็อพเพอร์ตี้ที่ตัดทอนแอตทริบิวต์จะทำให้เกิดข้อผิดพลาดในบริบทอ็อบเจ็กต์ที่มีการจัดการ ถ้าคุณสามารถพัฒนาได้ด้วย Xcode 6.x และ iOS 8 ให้เปิดใช้การดีบักข้อมูลพร็อกซีข้อมูลหลักโดยส่งอาร์กิวเมนต์การเริ่มต้นไปยังแอปพลิเคชันของคุณ นี่ควรทำให้ปัญหาบางอย่างเกิดขึ้นกับคุณได้มากขึ้น แต่เพียงเรียกใช้ performBlock: ในบริบทที่สร้างขึ้นด้วย - int ควรเป็นสาเหตุให้ข้อยกเว้นถูกโยนทิ้งไปแล้ว หากใบสมัครของคุณกำลังทำอะไรบางอย่างเพื่อกลืนข้อยกเว้นที่อาจจะซ่อนปัญหานี้ไว้ มันไม่ชัดเจนจากสภาพอากาศคำถามของคุณที่คุณเห็นนี้เฉพาะเมื่อคุณกำลังพยายามที่จะเข้าถึงเส้นทางในดีบักหรือถ้าคุณยังเห็นการทำงานที่ไม่ดีเมื่อใช้มัน เมื่อดีบักวัตถุที่ได้รับการจัดการคุณต้องตระหนักถึงความสำคัญมากเมื่อคุณทำข้อผิดพลาดเกี่ยวกับค่าคุณสมบัติ เป็นไปได้ว่าในกรณีนี้คุณจะเห็นอาร์เรย์ที่ว่างเปล่าในดีบักเกอร์เท่านั้นเนื่องจากมีการเข้าถึงในลักษณะที่ไม่ก่อให้เกิดความผิดพลาดในการยิงซึ่งจะเป็นพฤติกรรมที่ถูกต้อง จากคำอธิบายเกี่ยวกับลักษณะการทำงานของแอ็พพลิเคชันอื่น ๆ ดูเหมือนว่าจะเป็นไปได้ว่านี่เป็นข้อ จำกัด ของปัญหาของคุณ - หลังจากค่าทั้งหมดถูกต้องอย่างถูกต้อง น่าเสียดายที่คู่มือการเขียนโปรแกรมข้อมูลแกนกลางแทบจะกล่าวถึงสิ่งที่ผิดพลาดอยู่ และทำแบบเคียงข้างกันด้วยเอกลักษณ์ Faulting เป็นส่วนพื้นฐานของ Core Data ซึ่งเป็นจุดที่ใช้งานได้มากที่สุดและเกือบจะไม่มีส่วนเกี่ยวข้องกับการใช้งานแบบ uniquing โชคดีที่หลายปีที่ผ่านมาคู่มือการจัดเก็บรายการที่เพิ่มขึ้นได้รับการอัปเดตโดยมีข้อมูลเชิงลึกมากมายเกี่ยวกับข้อมูลภายในของข้อมูลหลักรวมถึงความผิดพลาด การทดสอบและ singleton ของคุณมีปัญหาอื่น ๆ ซึ่งน่าเสียดายเกินกว่าขอบเขตของคำถามนี้ ปัญหาอาจเกิดจากการไม่ลบที่จัดเก็บแบบเก่าระหว่างรันการทดสอบ วัตถุที่คุณกำลังตรวจสอบอาจไม่ใช่วัตถุเดียวกันกับที่คุณเพิ่งเพิ่มเข้าไป ตรวจสอบว่าไม่มีการตั้งค่าคุณสมบัติชั่วคราว แอตทริบิวต์ชั่วคราวไม่ได้รับการยืนยัน นี่คือสิ่งที่อาจเกิดขึ้นในการทดสอบ ในบางช่วงเวลาคุณสร้างการทำงานใหม่โดยไม่ใช้เส้นทางและบันทึกไว้ ระหว่างการทดสอบครั้งต่อไปคุณจะสร้างวัตถุรันอื่นด้วยวันที่เดียวกัน DATE01 แทนที่จะตรวจสอบเส้นทางของพร็อพเพอร์ตี้ที่เพิ่งสร้างขึ้นคุณกำลังดำเนินการดึงข้อมูลตามวันที่ ทุกเส้นทางของคุณมีวันที่เดียวกันดังนั้นการจัดเรียงตามวันที่จะไม่ส่งผลต่อผลลัพธ์ที่เรียงตามลำดับ วัตถุแรกของผลลัพธ์การดึงข้อมูลของคุณเกิดขึ้นเป็นวัตถุเก่าบางส่วนที่คุณไม่ได้กำหนดเส้นทางคุณสมบัติไว้ ในกรณีที่บันทึกค่า newRun. route ภายใน - saveNewRunWithDate วิธี. ตอบเมื่อวันที่ 27 มค. ที่ 12:29 เวลาตอบคำถามให้ข้อมูลเกี่ยวกับความผิดพลาดของ Core Data และความแตกต่างและกลอุบายต่างๆที่อยู่ในนั้น หลังจากทำบางขุดและด้วยความช่วยเหลือของคำตอบที่ผมพบว่าการแก้ปัญหา ก่อนที่จะดึงเอนทิตีที่ต้องการ (ปัญหา) ให้รีเฟรช NSManagedObject ใน NSManagedObjectContext: การอัพเดตคุณสมบัติถาวรของออบเจ็กต์ที่มีการจัดการเพื่อใช้ค่าล่าสุดจากสโตร์แบบต่อเนื่อง นอกจากนี้ยังเปลี่ยนวัตถุเป็นข้อบกพร่อง ตอบ Jan 31 15 at 19:33 ฉันมีปัญหาที่คล้ายกันนี้ซึ่งฉันพบว่ายากที่จะแก้ไข ในที่สุดฉันก็แก้ไขได้ แต่ไม่ใช่วิธีแก้ปัญหาที่นี่ ฉันต้องการแบ่งปันสิ่งที่ฉันพบเพื่อประโยชน์ของทุกคนที่ต้องเผชิญกับความท้าทายเช่นเดียวกับฉัน ในกรณีของฉันปัญหาคือเนื่องจากฉันกำลังพยายามใช้ NSMutableArray เป็นแอตทริบิวต์ข้อมูลหลักที่สามารถเปลี่ยนแปลงได้ แต่ตอนนี้ฉันเข้าใจว่าคุณไม่ควรทำอย่างนั้น คุณควรใช้อาร์เรย์ที่ไม่เปลี่ยนรูป (เช่น NSArray) จากนั้นถ้าคุณต้องการเปลี่ยนค่าในอาร์เรย์คุณจะต้องคัดลอกอาร์เรย์ข้อมูลหลักไปยังอาร์เรย์ที่ไม่สามารถเปลี่ยนแปลงได้ในท้องถิ่น (เช่น var NSArray ใน Swift) ทำการเปลี่ยนแปลงไปที่โลคัล array และเรียกใช้คำสั่งเพื่อให้อาร์เรย์ข้อมูลหลักเท่ากับอาร์เรย์ภายในที่เปลี่ยนแปลง จากนั้นให้บันทึกข้อมูลหลักตามปกติ ที่ฉันกล่าวว่าปัญหาของฉันก็คล้ายกับที่นี่ แต่ก็ไม่ได้เหมือนกัน ดังนั้นฉันจึงไม่อ้างว่าเป็นทางออกสำหรับปัญหานี้ ฉันเพียง แต่แบ่งปันสิ่งนี้เพื่อประโยชน์อื่น ๆ ในกรณีนี้ก็ช่วยได้ #: 22430 c # exchange data-center User: n / a Answer: 2459 Stack Exchange, IncUsing ampamp ampamp คุณสมบัติข้อมูลไบนารีในข้อมูล Core: ที่คุณทราบคุณสมบัติข้อมูลหลักสามารถมีคุณสมบัติเช่น Undefined, Integer16, Integer32, Integer64, Float, ทศนิยม, Date, Boolean, String, Double, ข้อมูลไบนารีใน Objective C มีให้ จากข้อมูลทั้งหมดเหล่านี้จะต้องพิจารณาข้อมูลไบนารี ด้วยการสนับสนุนคุณสมบัติทั้งหมดเหล่านี้ Swift language ยังให้คุณสามารถเปลี่ยนแปลงคุณสมบัติซึ่งเป็นสิ่งที่น่าสนใจอย่างยิ่ง เนื่องจากคุณสมบัตินี้คุณจึงสามารถใส่ข้อมูลประเภทใดก็ได้ลงในข้อมูลหลักโดยไม่มีค่าใช้จ่ายเพิ่มเติม ในบทแนะนำนี้ฉันจะแสดงวิธีใช้ทั้งสองคุณสมบัติเหล่านี้ (คุณสมบัติ Binary Data ampamp Transformable) 1. ตามปกติสร้างแอ็พพลิเคชันแอ็พพลิเคชัน singleView เทมเพลตแอ็ปพลิเคชันชื่อว่า ImportantDataTypeInCoreData ampamp เลือกภาษาที่รวดเร็วออกจากช่องทำเครื่องหมายข้อมูลหลักไม่ได้เลือกเราจะแทรกโมเดลข้อมูลหลักของเราในภายหลัง ดังแสดงในรูปด้านล่าง: 2. เพิ่มเพลงที่มี URL ที่เราจะจัดเก็บไว้ในแอตทริบิวต์ urlOfSong ซึ่งเราจะสร้างในรูปแบบสั้น ๆ 3. ขณะนี้เรามีโครงการที่จะใช้ ampamp ให้สมบูรณ์เราจะใช้คุณสมบัติ Core Data เพื่อสร้างคลาส Cocoa Touch ที่มีชื่อ Persistence ซึ่งเป็น subclass ของ NSObject ampamp แล้วสำหรับการคลิกโมเดลคลิกที่ ThisKitDataTypeInCoreData คลิกที่ New File - gt ข้อมูลหลัก (ฟิลด์ iOS) - gtData Model ampamp ตั้งชื่อคุณสมบัตินี้จากนั้นดำเนินการต่อจนกว่าจะมีการสร้างขึ้นตามที่แสดงในภาพ: 4. ตอนนี้เปิดโมเดลที่คุณสร้างขึ้น ampamp เพิ่มเอนทิตีที่ชื่อว่า UseOfDataTypes โดยมีแอตทริบิวต์ urlOfSong ampamp สองประเภทประเภท Transformable ampamp ข้อมูลไบนารีตามลำดับแสดงไว้ในภาพด้านล่าง: 5. เก็บเอนทิตี UseOfDataTypes ที่เลือกไว้เราจะสร้างคลาส NSObject คลิกที่ตัวแก้ไข ampamp จากนั้นคลิกที่ตัวเลือก Create Amplifier NSManagedObject Subclass ตามคำแนะนำจนกว่าจะมีการสร้างคลาสที่มีชื่อเดียวกับเอนทิตี NSObject subclass ถูกสร้างขึ้นโดยใช้ชื่อเดียวกันกับ entity ที่ชื่อว่า UseOfDataTypes เปิด ampamp คุณจะเห็นสิ่งที่แสดงในภาพด้านล่างนี้ Image: ดังที่แสดงใน image urlOfSong attribute นี้เป็นประเภท AnyObject เนื่องจากเป็น ampable transformable ชนิดนี้จะต้องมีการแปลง ในสิ่งที่เราต้องเก็บไว้ในชื่อ ampamp Core Data คือ NSData ประเภทเพราะเรากำหนดให้เป็นข้อมูลไบนารีในรูปแบบ ไปข้างหน้า ampamp แปลงชั้นเรียนของคุณให้เป็นส่วนที่แสดงด้านล่าง Image: var managedObjectContext NSManagedObjectContext ให้ modelURL NSBundle mainBundle () URLForResource (properties พร้อมด้วย extension: momd) ให้ managedObjectModel NSManagedObjectModel (contentOfURL: modelURL) ให้การเก็บข้อมูล storeURL Persistence. applicationDocumentDirectory URLByAppendingPathComponent (properties. sqlite) ให้ persistentStoreCoordinator NSPersistentStoreCoordinator (managedObjectModel: managedObjectModel) var error NSError nil if (persistentStoreCoordinator. addPersistentStoreWithType. การกำหนดค่า: ไม่มี URL: storeURL, options: nil. error: amperror) nil) ให้ managedObjectContext NSManagedObjectContext () managedObjectContext. persistentStoreCoordinator persistentStoreCoordinator ที่นี่ในโค้ดที่แสดงด้านบนทั้งหมดที่เรากำลังทำอยู่นั้นเป็นเพียงการสร้างเส้นทางที่เราเก็บโมเดลไว้ซึ่งเราสร้างชื่อว่า amp. privacy. xcdatamodeld แล้วสร้างแอ็ตทริบิวต์แอมป์ ampamp ampamp ampient Context ของผู้จัดเก็บที่มีอยู่แล้ว ------ gtgtgtgtgtgt ตอนนี้เรามีการตั้งค่าทุกอย่างเพิ่มโค้ดต่อไปนี้ไปยังไฟล์ Persistence. Swift เพื่อจัดเก็บอ็อบเจ็กต์ไปยังข้อมูลหลัก: ให้ anyObject NSEntityDescription. insertNewObjectForEntityForName (UseOfDataTypes. inManagedObjectContext: managedObjectContext) as. UseOfDataTypes ปล่อยเส้นทาง NSURL (fileURLWithPath: NSBundle mainBundle () pathForResource (pooja ofType: mp3)) เส้นทาง anyObject. urlOfSong เป็น NSURL var archievedName NSKeyedArchiver เก็บข้อมูลDataWithRootObject (ชื่อ) เก็บข้อมูลเพื่อเก็บไว้ในข้อมูลหลักสำหรับแอตทริบิวต์ข้อมูลไบนารี

No comments:

Post a Comment