En règle générale, le fichier de magasin sqlite pour les applications de données principales se trouve dans
Bibliothèque> Prise en charge des applications> iPhone Simulator> 7.1 (ou toute version que vous utilisez)> Applications> (le dossier contenant votre application)> Documents
dossier, mais je ne le trouve pas dans IOS 8. Je suppose qu’ils ajouteraient simplement un dossier 8.0 dans le dossier iPhone Simulator, mais il n’y figure pas. Quelqu'un a-t-il pu le localiser?
J'ai réussi à localiser le fichier sqlite, et c'est dans ce chemin maintenant:
Bibliothèque/Développeur/CoreSimulator/Périphériques/(chiffres et lettres)/data/Conteneurs/Données/Application/(chiffres et lettres)/Documents /
(chiffres et lettres) correspond à un dossier qui serait unique pour votre application/ordinateur, mais ressemblerait à ceci: 779AE2245-F8W2-57A9-8C6D-98643B1CF01A
J'ai pu le trouver en allant dans appDelegate.m, en faisant défiler l'écran jusqu'à la
- (NSURL *)applicationDocumentsDirectory
méthode, et NSLogging le chemin de retour, comme ceci:
// Returns the URL to the application's Documents directory.
- (NSURL *)applicationDocumentsDirectory
{
NSLog(@"%@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
Cela vous donnera votre chemin unique, ce qui vous facilitera la tâche, car il est difficile de le localiser avec les 2 dossiers/chaînes non nommés de lettres et de chiffres.
Swift 4.2:
let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
print(paths[0])
Aucune des réponses n'indique le moyen le plus simple d'obtenir l'emplacement du fichier de base de données.
Il ne vous oblige même pas à modifier votre code source, car il s'agit d'un simple commutateur d'exécution dans XCode.
Essayez ceci en 3 étapes simples
Copiez le code suivant dans didFinishLaunchingWithOptions
votre appdelegate.m
et ajoutez un point d'arrêt avant la NSLog()
(BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSLog(@"%@",[paths objectAtIndex:0]);
}
Ou à Swift:
let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
print(paths[0])
2.Open Finder-> Go -> Go to folder et collez le chemin copié à l'étape 1
3. Yah !!! Vous êtes dans votre destination.
Si votre application utilise Core Data, il vous suffit de rechercher le fichier sqlite dans Terminal:
find ~ -name app_db_file_name.sqlite
Les résultats répertorieront le chemin d'accès complet aux dossiers du simulateur contenant votre application.
J'ai piraté ce one-liner ( Gist ): find ~/Library/Developer/CoreSimulator/Devices/ -name device.plist -exec sh -c "/usr/libexec/PlistBuddy -c \"print UDID\" '{}' | tr '\n' ' '" \; -exec sh -c "/usr/libexec/PlistBuddy -c \"print name\" '{}' | tr '\n' ' '" \; -exec sh -c "/usr/libexec/PlistBuddy -c \"print runtime\" '{}' | sed -n 's/com\.Apple\.CoreSimulator.SimRuntime\.\(.*\)/\1/p'" \;
Cela imprime:
14F313C8-3813-4E38-903E-2010C136B77B iPad Retina iOS-8-0
1F6B82A2-C467-479A-8CAF-074BE507AC8E iPad Air iOS-8-0
2DA83944-BE5D-4342-B330-08F67A932D8C iPad 2 iOS-7-1
48703432-A5C5-4606-9369-0D21B53EB1E8 iPhone 4s iOS-7-1
4AFB71CC-6752-4F9A-A239-4DC9CA53A8B8 iPhone 5s iOS-8-0
53A65771-DF50-4A5C-A8D2-4D1C3A5D0F60 iPhone 5 iOS-7-1
6B97C174-5914-4E89-8D17-943F0E2703BA iPhone 5 iOS-8-0
6C2DF3E9-FA26-4391-8B66-72E1467D6297 iPad 2 iOS-8-0
7F85E299-A3C2-4704-8B44-2984F6F995F5 iPad Retina iOS-7-1
8B9EDFFD-2240-476B-88AD-06ABE8F9FF51 iPhone 6 Plus iOS-8-0
97691E5D-5C38-4875-8AA7-C2B1E4ABCBB5 Resizable iPhone iOS-8-0
9BBF3408-6CA4-4CE0-BD4E-B02001F1262B iPhone 5s iOS-7-1
C9237847-F0AA-44BC-A74E-C08C2E0F7A6C Resizable iPad iOS-8-0
CC44C1BA-F39C-4410-AE34-4ABBD7806D45 iPad Air iOS-7-1
CDF4D811-5011-4464-8291-5CDA378375EA iPhone 6 iOS-8-0
E77DE00C-E244-4F25-A5E2-E6581614D5A2 iPhone 4s iOS-8-0
Mise à jour:
Comme quelqu'un l'a souligné ici , il est également possible d'exécuter xcrun simctl list devices
pour obtenir un résultat similaire:
== Devices ==
-- iOS 7.0 --
-- iOS 7.1 --
iPhone 4s (48703432-A5C5-4606-9369-0D21B53EB1E8) (Shutdown)
iPhone 5 (53A65771-DF50-4A5C-A8D2-4D1C3A5D0F60) (Shutdown)
iPhone 5s (9BBF3408-6CA4-4CE0-BD4E-B02001F1262B) (Shutdown)
iPad 2 (2DA83944-BE5D-4342-B330-08F67A932D8C) (Shutdown)
iPad Retina (7F85E299-A3C2-4704-8B44-2984F6F995F5) (Shutdown)
iPad Air (CC44C1BA-F39C-4410-AE34-4ABBD7806D45) (Shutdown)
-- iOS 8.1 --
iPhone 4s (0763EF65-DD0D-4FAD-84C7-2DE63D416526) (Shutdown)
iPhone 5 (868ED444-8440-4115-AF37-F419CC682D2F) (Shutdown)
iPhone 5s (E0455E5D-7315-4EC8-B05E-76284728244C) (Shutdown)
iPhone 6 Plus (72554908-FF99-4B8F-9B87-65255ED08CFC) (Shutdown)
iPhone 6 (32AA8133-53A4-4BE0-8CE5-0C7A87E81CAF) (Shutdown)
iPad 2 (4AF84DE8-CBA2-47AE-A92A-0C0CEF9F41F8) (Booted)
iPad Retina (69238B44-AAFD-4CD5-AAEA-C182D0BC300D) (Shutdown)
iPad Air (E580AD99-0040-4EC1-B704-0C85567E6747) (Shutdown)
Resizable iPhone (32E872FC-6513-41AB-A5B9-B23EB7D10DC8) (Shutdown)
Resizable iPad (99997922-4A9F-4574-9E3E-EF45F893F4A2) (Shutdown)
Si vous utilisez Swift, le chemin absolu du répertoire du document sera renvoyé:
func applicationDirectoryPath() -> String {
return NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last! as String
}
J'ai écrit un script bash pour trouver l'emplacement de votre dossier d'application et du dossier de données d'application dans un simulateur. Vous pouvez le télécharger ici . Une fois que vous avez décompressé le script, vous pouvez naviguer vers le dossier dans lequel se trouve le script et l'utiliser. Si vous l’appelez sans option, vous obtiendrez une liste des simulateurs iOS installés. Vous pouvez ensuite utiliser les options pour trouver votre programme. L'écriture:
./simulatorAppFolders -s "iPad Air" -i iOS-8-0 -a <MyApp>
trouveront le dossier de l’application et le dossier de la zone d’accueil de votre application sur le simulateur iPad Air iOS 8. Voici un exemple:
MacBook-Air:_posts user$ ./simulatorAppFolders -s "iPad Air" -i iOS-8-0 -a MyApp
App folder = /Users/james/Library/Developer/CoreSimulator/Devices/6A9DEE93-FAEF-4BF4-9989-BC14CD38AEA0/data/Containers/Bundle/Application/8F64CD7F-A227-43D6-98AC-41D3919827CB
dataFolder = /Users/james/Library/Developer/CoreSimulator/Devices/6A9DEE93-FAEF-4BF4-9989-BC14CD38AEA0/data/Containers/Data/Application/96C40A21-5A5C-4399-839C-B155B8A72932
Il existe une mise à jour du script d'origine qui vous permet d'effectuer une recherche en fonction du type de périphérique à l'aide de l'option -d. J'ai également écrit un autre script qui crée une série de dossiers bien nommés pour que vous puissiez trouver votre application et ses documents. Ce script créera un dossier appelé iOS_SIMULATORS dans votre région d'origine et vous pourrez facilement naviguer vers votre application à partir de là.
D'après les réponses de Michaels, ceci est pour Swift 3
func applicationDirectoryPath() -> String {
return NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! as String
}
J'ai pu localiser le dossier des simulateurs avec la prochaine sortie de la console:
NSLog(@"app dir: %@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);
dans mon cas c'était (Xcode 6 beta)
app dir: file:///Users/user/Library/Developer/CoreSimulator/Devices/D00C56D4-DDA3-47B0-9951-27D3B9EC68E8/data/Applications/6ABF3E54-37F5-4AD1-A223-F7467F601FB6/Documents/
Pour Swift 3.
let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
print(paths[0])
vous pouvez obtenir l'emplacement de Coredata dans Xcode 8.2
Après de nouvelles mises à jour de Xcode, j’ai constaté que les fichiers SQL sont maintenant stockés dans un nouveau dossier /Library/Application Support
. Cela pourrait être une situation unique, mais si vous le faisiez non trouvé les fichiers SQL dans le dossier de documents les chercher ici:
_~/Library/Developer/CoreSimulator/Devices/[@device_id@]/data/Containers/Data/Application/[@application_id@]/Library/Application Support/
_
avant qu'il ne soit stocké dans le dossier Documents
:
_~/Library/Developer/CoreSimulator/Devices/[@device_id@]/data/Containers/Data/Application/[@application_id@]/Documents/
_
Pour Swift 3:
Copier coller ce code dans didFinishLaunchingWithOptions
print(NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true).last! as String)
Pour Swift
print(NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true).last! as String)
Comme James Snook J'ai créé mon propre script pour faciliter l'accès aux applications du simulateur. Je pense que cela peut être pratique pour beaucoup de gens qui arrivent ici, à part moi.
Contrairement à son script, le mien n’est pas un outil de recherche, il crée une structure de dossiers complète (et lisible par l’homme) avec tous les appareils/runtimes, et ajoute des liens souples aux applications qu’ils contiennent.
Vous pouvez l'obtenir dans ce Gist .
Exécutez-le chaque fois que vous installez une application dans le simulateur ou exécutez-le chaque fois que vous allez chercher une application pour une raison quelconque (elle sera mise à jour et ouvrira le dossier des périphériques dans le Finder).
Si vous n'avez spécifié aucun répertoire, vous pouvez utiliser le code ci-dessous pour imprimer le répertoire par défaut:
print (NSPersistentContainer.defaultDirectoryURL ())
Swift 4.x
let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
print(paths[0])
Swift 4.2
let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
print(paths[0])
Swift 3.x
Localisez ( didFinishLaunchingWithOptions fonction dans votre AppDelegate fichier et passé ce code là.
let path = NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true)
print("\(path)")
Pour iOS 10.0+
, vous pouvez utiliser persistentContainer.persistentStoreCoordinator.persistentStores.first?.url
J'ai créé la fonction Utilitaire qui copie le fichier sqlite à l'emplacement de votre choix (fonctionne uniquement pour le simulateur).
Vous pouvez l'utiliser comme
import CoreData
let appDelegate = UIApplication.shared.delegate as! AppDelegate
UTility.getSqliteTo(destinationPath: "/Users/inderkumarrathore/Desktop", persistentContainer: appDelegate.persistentContainer)
Si vous avez déjà accès aux fichiers sqlite, shm et wal, exécutez les commandes du terminal pour fusionner le fichier WAL dans le fichier sqlite.
$ sqlite3 persistentStore
sqlite> PRAGMA wal_checkpoint;
Press control + d
Après avoir exécuté les commandes ci-dessus, vous pouvez voir les données dans votre fichier sqlite.
Voici la définition de la méthode d’utilité pour Swift
/**
Copies the sqlite, wal and shm file to the destination folder. Don't forget to merge the wal file using the commands printed int the console.
@param destinationPath Path where sqlite files has to be copied
@param persistentContainer NSPersistentContainer
*/
public static func getSqliteTo(destinationPath: String, persistentContainer: NSPersistentContainer) {
let storeUrl = persistentContainer.persistentStoreCoordinator.persistentStores.first?.url
let sqliteFileName = storeUrl!.lastPathComponent
let walFileName = sqliteFileName + "-wal"
let shmFileName = sqliteFileName + "-shm"
//Add all file names in array
let fileArray = [sqliteFileName, walFileName, shmFileName]
let storeDir = storeUrl!.deletingLastPathComponent()
// Destination dir url, make sure file don't exists in that folder
let destDir = URL(fileURLWithPath: destinationPath, isDirectory: true)
do {
for fileName in fileArray {
let sourceUrl = storeDir.appendingPathComponent(fileName, isDirectory: false)
let destUrl = destDir.appendingPathComponent(fileName, isDirectory: false)
try FileManager.default.copyItem(at: sourceUrl, to: destUrl)
print("File: \(fileName) copied to path: \(destUrl.path)")
}
}
catch {
print("\(error)")
}
print("\n\n\n ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ NOTE ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~\n")
print("In your terminal run the following commands to merge wal file. Otherwise you may see partial or no data in \(sqliteFileName) file")
print("\n-------------------------------------------------")
print("$ cd \(destDir.path)")
print("$ sqlite3 \(sqliteFileName)")
print("sqlite> PRAGMA wal_checkpoint;")
print("-------------------------------------------------\n")
print("Press control + d")
}
Pour objectif-c
/**
Copies the sqlite, wal and shm file to the destination folder. Don't forget to merge the wal file using the commands printed int the console.
@param destinationPath Path where sqlite files has to be copied
@param persistentContainer NSPersistentContainer
*/
+ (void)copySqliteFileToDestination:(NSString *)destinationPath persistentContainer:(NSPersistentContainer *)persistentContainer {
NSError *error = nil;
NSURL *storeUrl = persistentContainer.persistentStoreCoordinator.persistentStores.firstObject.URL;
NSString * sqliteFileName = [storeUrl lastPathComponent];
NSString *walFileName = [sqliteFileName stringByAppendingString:@"-wal"];
NSString *shmFileName = [sqliteFileName stringByAppendingString:@"-shm"];
//Add all file names in array
NSArray *fileArray = @[sqliteFileName, walFileName, shmFileName];
// Store Directory
NSURL *storeDir = storeUrl.URLByDeletingLastPathComponent;
// Destination dir url, make sure file don't exists in that folder
NSURL *destDir = [NSURL fileURLWithPath:destinationPath isDirectory:YES];
for (NSString *fileName in fileArray) {
NSURL *sourceUrl = [storeDir URLByAppendingPathComponent:fileName isDirectory:NO];
NSURL *destUrl = [destDir URLByAppendingPathComponent:fileName isDirectory:NO];
[[NSFileManager defaultManager] copyItemAtURL:sourceUrl toURL:destUrl error:&error];
if (!error) {
RLog(@"File: %@ copied to path: %@", fileName, [destUrl path]);
}
}
NSLog(@"\n\n\n ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ NOTE ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~\n");
NSLog(@"In your terminal run the following commands to merge wal file. Otherwise you may see partial or no data in %@ file", sqliteFileName);
NSLog(@"\n-------------------------------------------------");
NSLog(@"$ cd %@", destDir.path);
NSLog(@"$ sqlite3 %@", sqliteFileName);
NSLog(@"sqlite> PRAGMA wal_checkpoint;");
NSLog(@"-------------------------------------------------\n");
NSLog(@"Press control + d");
}