web-dev-qa-db-fra.com

Fichier de base des données de base

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?

83
enlyte

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])
126
enlyte

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.

  1. Choisissez Edit Scheme ... à côté du bouton Run.

    edit scheme

  2. Sélectionnez Exécuter/Arguments et ajoutez les deux options suivantes:

    -com.Apple.CoreData.SQLDebug 1
    -com.Apple.CoreData.Logging.stderr 1
    

    option

  3. Exécutez l'application et vous verrez dans les journaux:

    logs

52
hyperknot

Essayez ceci en 3 étapes simples

  1. 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])

enter image description here

2.Open Finder-> Go -> Go to folder et collez le chemin copié à l'étape 1

enter image description here

3. Yah !!! Vous êtes dans votre destination.

51

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.

37
DiscDev

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)
20
Alexander

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
}
17
Mike Rapadas

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

Mise à jour

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à.

13
James Snook

D'après les réponses de Michaels, ceci est pour Swift 3

    func applicationDirectoryPath() -> String {
        return NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! as String
    }
6
Jochen Bedersdorfer

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/
6
vir us

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

5
Tech

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/_

4
Nazir

Pour Swift 3:

Copier coller ce code dans didFinishLaunchingWithOptions

 print(NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true).last! as String)
4
Sandu

Pour Swift

print(NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true).last! as String)
3
Andrew Shon

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).

2
fbeeper

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 ())

1
Ashutosh Shukla

Swift 4.x

    let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
    print(paths[0])
0
Darshan

Swift 4.2

let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
        print(paths[0])
0
Divesh Singh

Swift 3.x

Localisez ( didFinishLaunchingWithOptions fonction dans votre AppDelegate fichier et passé ce code là.

let path = NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true)
print("\(path)")
0
Chetan

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");
}
0