Dans Xcode 6, j'ai une application dans laquelle j'utilise Core Data, mais il n'y a pas de dossier dans Application Support pour le simulateur iPhone iOS 8. Où mes fichiers et la base de données sqlite Core Data sont-ils stockés?
Dans Xcode 6, j'ai une application dans laquelle j'utilise Core Data, mais il n'y a pas de dossier dans Application Support pour le simulateur iPhone iOS 8. Où mes fichiers et la base de données sqlite Core Data sont-ils stockés?
Réponses:
Le répertoire du simulateur a été déplacé avec Xcode 6 beta vers ...
~/Library/Developer/CoreSimulator
Parcourir le répertoire dans le dossier Documents de votre application est un peu plus ardu, par exemple,
~/Library/Developer/CoreSimulator/Devices/4D2D127A-7103-41B2-872B-2DB891B978A2/data/Containers/Data/Application/0323215C-2B91-47F7-BE81-EB24B4DA7339/Documents/MyApp.sqlite
~/Library/Developer/CoreSimulator/Devices/B2C6629C-998D-4E84-9ADB-06CAF5BA4B89/data/Containers/Data/Application/62593001-FADA-4647-AA80-FE9973956C05/Documents/
#if DEBUG NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"]; NSString *aliasPath = [NSString stringWithFormat:@"XCodePaths/%@", appName]; remove([aliasPath UTF8String]); [[NSFileManager defaultManager]createSymbolicLinkAtPath:aliasPath withDestinationPath:DOCS_DIR error:nil]; #endif
Maintenant, j'ai un lien sim qui fonctionne, même si iOS8 + XCode6 change le GUID de données de mon application à chaque fois que je construis.
xcrun simctl list
commande peut être utilisée pour voir la correspondance entre les noms du simulateur et les UDID de l'appareil. Ou plus précisément la xcrun simctl list devices
commande.
Je vous suggère d'utiliser SimPholders pour trouver vos fichiers Simulator. C'est un élément de la barre de menu qui suit vos applications de simulateur et vous permet d'accéder directement à leurs dossiers et à leur contenu. C'est génial.
J'ai trouvé SimulatorManager application très utile. Il vous amène directement au dossier d'application des simulateurs installés. J'ai essayé avec des simulateurs 7.1, 8.0 et 8.1.
SimulatorManager se présente sous la forme d'une icône dans la barre d'état système et fournit une option pour «Lancer à la connexion».
Remarque : cela ne fonctionne qu'avec Xcode 6 (6.1.1 dans mon cas) et supérieur.
J'espère que cela pourra aider!
Pour savoir où votre fichier .sqlite est stocké dans votre AppDelegate.m, ajoutez le code suivant
- (NSURL *)applicationDocumentsDirectory
{
NSLog(@"%@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
appelez maintenant cette méthode dans AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//call here
[self applicationDocumentsDirectory];
}
J'ai lutté avec ça pendant un certain temps. Il est devenu très difficile d'accéder simplement à ma base de données sqlite locale. J'ai écrit ce script et en ai fait un extrait de code dans XCode. Je le place dans mon appDidFinishLaunching dans mon appDelegate.
//xcode 6 moves the documents dir every time. haven't found out why yet.
#if DEBUG
NSLog(@"caching documents dir for xcode 6. %@", [NSBundle mainBundle]);
NSString *toFile = @"XCodePaths/lastBuild.txt"; NSError *err = nil;
[DOCS_DIR writeToFile:toFile atomically:YES encoding:NSUTF8StringEncoding error:&err];
if(err)
NSLog(@"%@", [err localizedDescription]);
NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"];
NSString *aliasPath = [NSString stringWithFormat:@"XCodePaths/%@", appName];
remove([aliasPath UTF8String]);
[[NSFileManager defaultManager] createSymbolicLinkAtPath:aliasPath withDestinationPath:DOCS_DIR error:nil];
#endif
Cela crée un lien sim à la racine de votre lecteur. (Vous devrez peut-être créer ce dossier vous-même la première fois et le modifier, ou vous pouvez changer l'emplacement à un autre endroit) Ensuite, j'ai installé le plugin xcodeway https://github.com/onmyway133/XcodeWay
Je l'ai un peu modifié pour qu'il me permette d'appuyer simplement sur cmd + d et il ouvrira un enrouleur de recherche dans le répertoire persistant Documents de mon application actuelle. De cette façon, peu importe le nombre de fois que XCode modifie votre chemin, il ne change que lors de l'exécution, et il met à jour votre simlink immédiatement à chaque exécution.
J'espère que cela sera utile pour les autres!
Ouvrez Finder> Bibliothèque> Développeur> CoreSimulator> Périphériques
Ensuite, l'icône de changement d'arrangement dans le viseur, sélectionnez la date d'ajout
Sélectionnez votre application> données> Conteneur> données> Applications>
choisissez votre application> Documents> Voici votre fichier db
Dans mon cas:
/Users/pluto/Library/Developer/CoreSimulator/Devices/A75107D2-A535-415A-865D-978B2555370B/data/Containers/Data/Application/265A12BC-FF5B-4235-B5EF-6022B83754B4/Documents/dboPhotoBucket.sqlite
Sinon, procédez comme suit:
NSLog(@"app dir: %@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);
- Il imprimera le chemin complet du dossier de données.
Rapide:
let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
println("App Path: \(dirPaths)")
let dirPaths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) print("App Path: \(dirPaths)")
Utilisez Finder -> allez dans le dossier et entrez le chemin de base donné pour atteindre les dossiers d'application
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSLog(@"%@",basePath);
Le simulateur place le fichier dans ~ / Library / Developer / CoreSimulator / Devices / ... mais le chemin après / Devices est différent pour tout le monde.
Utilisez cette méthode pratique. Il renvoie le chemin du répertoire temporaire de l'utilisateur actuel et ne prend aucun argument.
NSString * NSTemporaryDirectory ( void );
Donc, dans ma classe ViewController, je mets généralement cette ligne dans mon viewDidLoad juste pour une référence lorsque j'ai besoin de récupérer mon fichier stocké CoreData. J'espère que cela t'aides.
NSLog(@"FILE PATH :%@", NSTemporaryDirectory());
(Remarque: pour accéder au chemin, dans le menu du Finder, cliquez sur Go et tapez ~ / Library pour ouvrir le répertoire caché puis dans la fenêtre du Finder, vous pouvez cliquer sur le chemin indiqué sur votre console.)
Cet emplacement a, une fois de plus, changé, si vous utilisez Swift, utilisez-le pour savoir où se trouve le dossier (il est copié à partir du fichier AppDelegate.swift qu'Apple crée pour vous, donc si cela ne fonctionne pas sur votre machine, recherchez dans ce fichier pour la bonne syntaxe, cela fonctionne sur le mien en utilisant le simulateur Xcode 6.1 et iOS 8):
let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
println("Possible sqlite file: \(urls)")
Les simulateurs sont situés sous:
~/Library/Developer/CoreSimulator/
Ici, ils sont répertoriés comme des répertoires avec des noms UUID. Utilisez le tri par date de modification pour trouver le dernier. À l'intérieur, accédez à:
/data/Containers/Data/Application/
Ici, vous obtiendrez une liste de toutes les applications sur cet appareil. Vous pouvez à nouveau trier ceci pour obtenir la dernière application.
REMARQUE: Xcode change le nom du répertoire chaque fois que vous exécutez l'application, alors ne comptez pas sur la création d'alias / raccourcis sur le bureau.
Le moyen le plus simple est d'utiliser l'application ici , qui fait tout automatiquement.
J'ai créé ce script qui compressera la dernière application conçue pour n'importe quel simulateur et la compressera sur le bureau.
https://gist.github.com/Gerst20051/8ca49d5afbf09007b3696fab6e9f425c
#!/bin/bash
DESTINATION_DIR="$HOME/Desktop"
APP_PATH=$(find ~/Library/Developer/CoreSimulator/Devices/*/data/Containers/Bundle/Application/*/*.app -type d -maxdepth 0 -print0 | xargs -0 ls -td | head -n1)
APP_DIRNAME=$(dirname "$APP_PATH")
APP_BASENAME=$(basename "$APP_PATH")
FILE_NAME="${APP_BASENAME%.*}"
cd "$APP_DIRNAME"
zip -qr "$DESTINATION_DIR/$FILE_NAME.zip" "$APP_BASENAME"
Dans Swift 4 ou Swift 5, vous pouvez utiliser NSHomeDirectory()
.
Le moyen le plus simple dans Xcode 10 (ou Xcode 11) est de suspendre votre application (comme quand elle atteint un point d'arrêt) et d'exécuter cette ligne dans la console du débogueur:
po NSHomeDirectory()
po
représente l'objet d'impression et imprime la plupart des choses
1. NSTemporaryDirectory() gives this:
/Users/spokaneDude/Library/Developer/CoreSimulator/Devices/1EE69744-255A-45CD-88F1-63FEAD117B32/data/Containers/Data/Application/199B1ACA-A80B-44BD-8E5E-DDF3DCF0D8D9/tmp
2. remove "/tmp" replacing it with "/Library/Application Support/<app name>/" --> is where the .sqlite files reside
Avec Swift 4, vous pouvez utiliser le code ci-dessous pour obtenir le répertoire d'accueil de votre application. Le répertoire de documents de votre application s'y trouve.
print(NSHomeDirectory())
Je pense que vous savez déjà que le répertoire personnel de votre application est modifiable, donc si vous ne souhaitez pas ajouter de code supplémentaire à votre base de code, SimPholder est un outil intéressant pour vous.
Et de plus, vous vous demandez peut-être s'il existe un outil qui peut vous aider à gagner du temps en fermant et en rouvrant la même base de données SQLite à chaque fois après le changement du répertoire de base de votre application. Et la réponse est oui, un outil que je connais est SQLiteFlow . D'après son document, il est dit que:
Gérez les changements de nom de fichier ou de répertoire de base de données. Cela permet à SQLiteFlow de fonctionner de manière conviviale avec votre base de données SQLite dans le simulateur iOS.
Voici le sh pour le dernier simulateur et application utilisé. Exécutez simplement sh et copiez le texte imprimé et collez et exécutez la commande pour afficher dans le Finder.
#!/bin/zsh
lastUsedSimulatorAndApplication=`ls -td -- ~/Library/Developer/CoreSimulator/Devices/*/data/Containers/Data/Application/*/ | head -n1`
echo $lastUsedSimulatorAndApplication