Xcode 4 และ Core Data: วิธีเปิดใช้งานการดีบัก SQL


102

ฉันกำลังทำงานกับแอป iOS สากลและฉันต้องการดู SQL ดิบในบันทึกเมื่อฉันทำการดีบัก มีข้อมูลบางอย่างในบล็อกโพสต์นี้เกี่ยวกับวิธีเปิดใช้งานการบันทึก SQL ดิบสำหรับการพัฒนา iOS Core Data ตัวอย่างที่ให้มาคือสำหรับ Xcode 3 และฉันไม่ชัดเจนว่าจะเปิดใช้งานสิ่งนี้ใน Xcode 4 ได้อย่างไร

ฉันได้ลอง "Product" -> "Edit Scheme" และเพิ่ม " -com.apple.CoreData.SQLDebug 1 " ไปที่ "Arguments Passed on Launch" แต่ฉันยังไม่เห็นผลลัพธ์ใด ๆ ในบันทึก ไม่แน่ใจว่าฉันมองผิดหรือแค่ส่งข้อโต้แย้งไม่ถูกต้อง


1
ขอบคุณสำหรับสิ่งนี้. ปัญหาหลักของฉันคือตารางที่ฉันกำลังค้นหามีมากกว่า 74,000 แถวและฉันต้องการทราบว่าข้อความค้นหาใช้เวลานานเท่าใดเนื่องจากตอนนี้ค่อนข้างช้า ฉันเคารพความจริงที่ว่ามีสิ่งที่เป็นนามธรรมเกิดขึ้นมากมาย แต่ฉันก็อยู่ในความมืดกับสิ่งที่เกิดขึ้นภายใต้ประทุน อย่างน้อยสิ่งนี้ก็ช่วยฉันได้เพียงเล็กน้อย
oalders

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

คำตอบ:


150

คุณควรดูที่เดียวกับที่คุณได้รับ NSLOGS

และคุณควรไปที่ Product -> Edit Scheme -> จากแผงด้านซ้ายเลือก Run YOURAPP.app และไปที่แท็บ Arguments ของแผงหลัก

คุณสามารถเพิ่ม Argument Passed On Launch ได้ที่นั่น

คุณควรเพิ่ม-com.apple.CoreData.SQLDebug 4(หมายเลขระหว่าง 1 ถึง 4 ตัวเลขที่สูงขึ้นทำให้มีรายละเอียดมากขึ้น)

กดตกลงเท่านี้คุณก็พร้อมแล้ว

สิ่งสำคัญคือการแก้ไขโครงร่างที่คุณจะใช้ในการทดสอบ


8
ขอบคุณสำหรับสิ่งนี้. ปรากฎว่าเท่าที่เครื่องจำลองใช้รูปแบบของอาร์กิวเมนต์ของฉันไม่ถูกต้องตามที่ฉันเห็นในหนึ่งในคำตอบที่นี่stackoverflow.com/questions/822906/… ฉันต้องส่งอาร์กิวเมนต์ของ-com.apple.CoreData.SQLDebugและอาร์กิวเมนต์ที่สองของ1เพื่อดูเอาต์พุต SQL
oalders

2
มีความคิดเห็นเกี่ยวกับวิธีการพิมพ์อาร์กิวเมนต์ที่ส่งไปยังฐานข้อมูลหรือไม่? วิธีนี้ใช้ได้ผลดีในการดูว่าแบบสอบถามมีโครงสร้างอย่างไร แต่จะพิมพ์เฉพาะคำสั่ง sql เช่นเดียวกับUPDATE ZTABLE SET ZCOLUMN = ? WHERE ZID = ?และไม่มีประโยชน์มากที่จะดูว่าข้อมูลที่ส่งไปคืออะไร
Felipe Sabino

จริงๆแล้วฉันคิดว่ามันจะดีกว่าถ้าเพิ่มเป็นคำถาม SO จริง ๆ ;) stackoverflow.com/questions/12306343/…
Felipe Sabino

มีวิธีใดบ้างที่ฉันสามารถบันทึกเฉพาะในกรณีที่แทรกลงในฐานข้อมูลไม่ได้สำหรับกรณีอื่น
Bishal Ghimire

@BishalGhimire ฉันไม่แน่ใจบางทีคุณอาจกรองตามเหตุการณ์ที่ไหนสักแห่ง ฉันจะกรองผลลัพธ์โดยตรงโดยใช้การกรองข้อความ
Nicolas S

20

XCode 4

ที่เดียวกับที่ฉันจัดการ NSZombieEnabled

ผลิตภัณฑ์ -> แก้ไข Scheme -> เรียกใช้การดีบัก YouApp.app

ภายใต้ "อาร์กิวเมนต์ที่ส่งผ่านเมื่อเปิดตัว" ให้วางทั้งหมด:

-com.apple.CoreData.SQLDebug 1

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


วิธีใดก็ได้ในการพิมพ์ -com.apple.CoreData.MigrationDebug 1 นี้ในไฟล์สตริงเพื่อให้ผู้ใช้สามารถอัปโหลดไฟล์บันทึกได้
rhlnair

5

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

-com.apple.CoreData.SQLDebug 1

และไม่ใช่แค่:

com.apple.CoreData.SQLDebug 1

ที่ทำงานให้ฉันทั้งในอุปกรณ์จำลองและอุปกรณ์จริง


3

โปรดทราบว่าคุณสามารถใส่ค่าที่ผ่านไปในระดับต่างๆได้ ซึ่งให้ความฟุ่มเฟื่อยมากขึ้น.

-com.apple.CoreData.SQLDebug 1
-com.apple.CoreData.SQLDebug 2
-com.apple.CoreData.SQLDebug 3
-com.apple.CoreData.SQLDebug 4 // This will actually show parameter binds ("?")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.