Xcode 4 y Core Data: cómo habilitar la depuración de SQL

102

Estoy trabajando en una aplicación universal de iOS y me gustaría ver el SQL sin procesar en los registros cuando estoy depurando. Hay algo de información en esta publicación de blog sobre cómo habilitar el registro SQL sin procesar para el desarrollo de datos centrales de iOS. El ejemplo dado es para Xcode 3 y no tengo claro cómo habilitar esto en Xcode 4.

Probé "Producto" -> "Editar esquema" y agregué " -com.apple.CoreData.SQLDebug 1 " a "Argumentos pasados ​​al iniciar", pero todavía no veo ningún resultado en los registros. No estoy seguro de si estoy buscando en el lugar equivocado o simplemente estoy pasando los argumentos incorrectamente.

Oalders
fuente
1
Gracias por esto. Mi problema principal es que la tabla en la que estoy buscando tiene poco más de 74,000 filas y quería tener una idea de cuánto tiempo se están ejecutando las consultas, ya que es bastante lento en este momento. Respeto el hecho de que hay mucha abstracción, pero estaba realmente a oscuras sobre lo que estaba pasando bajo el capó. Esto al menos me ayuda un poco.
oalders
Siempre que comprenda las limitaciones, está bien mirar el SQL sin procesar, especialmente para ajustar el rendimiento. Donde la gente se mete en problemas es tratando de averiguar cómo se comporta el gráfico de objetos mirando el SQL sin procesar. Dado que no existe una relación directa entre los dos, simplemente los lleva por mal camino.
TechZen

Respuestas:

150

Debería buscar en el mismo lugar donde obtiene NSLOGS

Y debe ir a Producto -> Editar esquema -> Luego, desde el panel izquierdo, seleccione Ejecutar YOURAPP.app y vaya a la pestaña Argumentos del panel principal.

Allí puede agregar un argumento transmitido al inicio.

Debe sumar -com.apple.CoreData.SQLDebug 4(número entre 1 y 4, un número más alto lo hace más detallado)

Presione OK y ya está todo listo.

La clave aquí es editar el esquema que usará para las pruebas.

Nicolas S
fuente
8
Gracias por esto. Resulta que, en lo que respecta al simulador, el formato de mis argumentos era incorrecto, como veo en una de las respuestas aquí stackoverflow.com/questions/822906/… Necesito pasar un argumento de -com.apple.CoreData.SQLDebug y un segundo argumento de 1 para ver la salida SQL.
oalders
2
¿Alguna idea sobre cómo imprimir los argumentos que se pasan a la base de datos? este enfoque funciona bien para ver cómo se está estructurando la consulta, pero imprime solo la declaración sql, como UPDATE ZTABLE SET ZCOLUMN = ? WHERE ZID = ?y no es muy útil para ver realmente cuáles son los datos que se envían
Felipe Sabino
En realidad, pensé que sería mejor agregarlo como una pregunta SO real;) stackoverflow.com/questions/12306343/…
Felipe Sabino
¿Hay alguna forma de que pueda iniciar sesión solo si se inserta en la base de datos, no para otro caso?
Bishal Ghimire
@BishalGhimire No estoy seguro, tal vez podrías filtrar por evento en alguna parte. Filtraría la salida directamente usando el filtrado de texto.
Nicolas S
20

XCode 4

Está en el mismo lugar donde administro mi NSZombieEnabled

Producto -> Editar esquema -> Ejecutar depuración de YouApp.app

En "Argumentos transmitidos al iniciar", pegue exactamente:

-com.apple.CoreData.SQLDebug 1

Advertencia: esto es muy detallado, si tiene problemas con los datos centrales, vale la pena analizarlo, pero también puede ser más información de la que necesita sobre lo incorrecto.

OverToasty
fuente
Cualquier forma de imprimir este -com.apple.CoreData.MigrationDebug 1 en un archivo de cadena, para que el usuario pueda cargar el archivo de registro
rhlnair
5

Tenía un problema con esto y luego me di cuenta de que era una omisión tonta, que supongo que es un error de esquina para algunos de ustedes. Cuando entré en el argumento Xcode (4.3.1), omití el guión inicial. No lo habría hecho si lo hubiera ingresado en una línea de comando, pero en la GUI lo había omitido. No encontré ninguna diferencia entre ingresar en 2 argumentos separados o uno (como sugirieron algunas publicaciones). Entonces usa:

-com.apple.CoreData.SQLDebug 1

y no simplemente:

com.apple.CoreData.SQLDebug 1

que funcionó para mí tanto en el simulador como en el dispositivo real

usuario730458
fuente
3

Tenga en cuenta que puede poner diferentes niveles del valor pasado. Que aportan cada vez más verbosidad.

-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 ("?")
netigger
fuente