Xcode 4 et Core Data: comment activer le débogage SQL

102

Je travaille sur une application iOS universelle et j'aimerais voir le SQL brut dans les journaux lorsque je débogue. Il y a quelques informations dans ce billet de blog sur la façon d'activer la journalisation SQL brute pour le développement iOS Core Data. L'exemple donné est pour Xcode 3 et je ne sais pas comment l'activer dans Xcode 4.

J'ai essayé "Product" -> "Edit Scheme" et ajouté " -com.apple.CoreData.SQLDebug 1 " à "Arguments Passed on Launch", mais je ne vois toujours aucune sortie dans les logs. Je ne sais pas si je regarde au mauvais endroit ou si je passe simplement les arguments de manière incorrecte.

oalders
la source
1
Merci pour cela. Mon principal problème est que la table sur laquelle je recherche contient un peu plus de 74 000 lignes et je voulais avoir une idée de la durée d'exécution des requêtes, car elle est assez lente pour le moment. Je respecte le fait qu'il y ait beaucoup d'abstraction en cours, mais j'étais vraiment dans l'ignorance de ce qui se passait sous le capot. Cela m'aide au moins un peu.
oalders
Tant que vous comprenez les limitations, il est bon de regarder le SQL brut, en particulier pour ajuster les performances. Là où les gens ont des problèmes, c'est d'essayer de comprendre comment le graphe d'objets se comporte en regardant le SQL brut. Puisqu'il n'y a pas de relation directe entre les deux, cela ne fait que les égarer.
TechZen

Réponses:

150

Vous devriez regarder au même endroit que vous obtenez NSLOGS

Et vous devriez aller à Produit -> Modifier le schéma -> Ensuite, dans le panneau de gauche, sélectionnez Exécuter YOURAPP.app et accédez à l'onglet Arguments du panneau principal.

Là, vous pouvez ajouter un argument transmis au lancement.

Vous devez ajouter -com.apple.CoreData.SQLDebug 4(un nombre entre 1 et 4, un nombre plus élevé le rend plus verbeux)

Appuyez sur OK et vous êtes prêt.

La clé ici est de modifier le schéma que vous utiliserez pour les tests.

Nicolas S
la source
8
Merci pour cela. Il s'avère que, en ce qui concerne le simulateur, le format de mes arguments était incorrect, comme je le vois dans l'une des réponses ici stackoverflow.com/questions/822906/ ... Je dois passer un argument de -com.apple.CoreData.SQLDebug et un deuxième argument de 1 pour voir la sortie SQL.
oalders
2
des réflexions sur la façon d'imprimer les arguments qui sont passés à la base de données? cette approche fonctionne très bien pour voir comment la requête est structurée, mais elle n'imprime que l'instruction sql, comme UPDATE ZTABLE SET ZCOLUMN = ? WHERE ZID = ?et il n'est pas très utile de vraiment voir quelles sont les données envoyées
Felipe Sabino
En fait, j'ai pensé qu'il serait préférable de l'ajouter comme une vraie question SO;) stackoverflow.com/questions/12306343/…
Felipe Sabino
est-il possible que je puisse me connecter uniquement si elle s'insère dans la base de données et non pour un autre cas?
Bishal Ghimire
@BishalGhimire Je ne suis pas sûr, peut-être que vous pourriez filtrer par événement quelque part. Je filtrerais la sortie directement en utilisant le filtrage de texte.
Nicolas S
20

XCode 4

C'est au même endroit que je gère mon NSZombieEnabled

Produit -> Modifier le schéma -> Exécuter le débogage YouApp.app

Sous "Arguments transmis au lancement", collez exactement:

-com.apple.CoreData.SQLDebug 1

Attention - ce truc est très détaillé, si vous rencontrez des problèmes de Core Data, cela vaut peut-être la peine d'être examiné, mais cela peut aussi contenir plus d'informations que ce dont vous avez besoin sur la mauvaise chose.

Trop savoureux
la source
Tout moyen d'imprimer ce -com.apple.CoreData.MigrationDebug 1 sur un fichier de chaîne, afin que l'utilisateur puisse télécharger le fichier journal
rhlnair
5

J'avais un problème avec cela, puis j'ai réalisé que c'était une omission idiote, ce qui, je suppose, est une erreur de venue pour certains d'entre vous. Quand j'ai entré l'argument Xcode (4.3.1), j'ai omis le tiret principal. Je ne l'aurais pas fait si je l'avais entré sur une ligne de commande, mais dans l'interface graphique, je l'avais omis. Je n'ai trouvé aucune différence entre la saisie de 2 arguments distincts ou d'un seul (comme certains articles l'avaient suggéré). Alors utilisez:

-com.apple.CoreData.SQLDebug 1

et pas simplement:

com.apple.CoreData.SQLDebug 1

qui a fonctionné pour moi à la fois dans un simulateur et un appareil réel

user730458
la source
3

Notez que vous pouvez mettre différents niveaux de la valeur transmise. Qui fournissent de plus en plus de verbosité.

-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
la source