Données de base de l'emplacement de fichier SQLite


91

En règle générale, le fichier de stockage sqlite pour les applications de données principales se trouve dans

Bibliothèque> Application Support> iPhone Simulator> 7.1 (ou selon la version que vous utilisez)> Applications> (quel que soit 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 ce n'est pas là. Quelqu'un a-t-il pu le localiser?


2
Je suis presque sûr que votre question est le double, étant donné que je l'ai posée plus d'une semaine avant que la vôtre ne soit posée. Ce serait apprécié si vous me permettez d'obtenir le crédit pour cette question, étant donné que c'est la première question que j'ai jamais posée, et il semble que vous avez déjà une réputation @HenryGlendening
enlyte

Découvrez comment vérifier dbpath stackoverflow.com/a/27358291/3840428
Nagarjun


2
Quelqu'un sait-il comment obtenir les fichiers CoreData à partir de l'appareil réel? J'avais l'habitude de le faire via iTunes dans les anciennes versions de Xcode, mais depuis Xcode 8 / iOS10, je ne pense pas que les fichiers CoreData soient stockés dans le répertoire des documents de l'application, donc non visibles dans iTunes. Existe-t-il un moyen d'obtenir les fichiers CoreDate de l'appareil sur votre ordinateur?
Bocaxica le

1
Je ne sais pas pourquoi ils continuent de proposer cela. Ils devraient le mettre quelque part et simplement le laisser.
RegularExpression

Réponses:


135

J'ai réussi à localiser le fichier sqlite, et c'est dans ce chemin maintenant:

Bibliothèque / Développeur / CoreSimulator / Appareils / (chiffres et lettres) / données / Conteneurs / Données / Application / (chiffres et lettres) / Documents /

(chiffres et lettres) représente un dossier qui serait unique à votre application / ordinateur, mais ressemblerait à ceci: 779AE2245-F8W2-57A9-8C6D-98643B1CF01A

J'ai pu le trouver en accédant à appDelegate.m, en faisant défiler vers le bas

- (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 de lettres et de chiffres sans nom.

Swift 4.2:

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

4
Utilisez xcrun simctl listpour obtenir la liste des noms de simulateurs et leurs UUID.
Sandy Chapman

1
Notez que si vous utilisez une base de données partagée pour un groupe d'applications (par exemple lorsque vous utilisez une extension), le chemin d'accès est Library / Developer / CoreSimulator / Devices / $ number / data / Containers / Shared / AppGroup / $ number / Name.sqlite
andreacipriani

7
Notez que, en 2019 , ce Library/Developer/CoreSimulator/Devices/(numbers and letters)/data/Containers/Data/Application/(numbers and letters)/Documents/n'est plus vrai. Maintenant, vous trouvez le .sqlite et les deux fichiers associés dansLibrary/Developer/CoreSimulator/Devices/(numbers and letters)/data/Containers/Data/Application/(numbers and letters)/Library/Application Support/
Gang Fang

@GangFang J'essaie de convertir mon code Objective C qui est construit dans Xcode 7 vers la dernière version swift et de créer un nouveau projet, alors comment je peux migrer ces deux fichiers .sqlite différents en un seul endroit.
Sanjay Shah

85

Aucune des réponses n'a mentionné le moyen le plus simple d'obtenir réellement l'emplacement du fichier DB.

Il ne vous oblige même pas à modifier votre code source, car il s'agit d'un simple changement de temps d'exécution dans XCode.

  1. Choisissez Modifier le schéma ... à côté du bouton Exécuter.

    modifier le schéma

  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:

    journaux


2
C'est en effet la solution la plus simple et la meilleure. Merci!
Omid Ariyan

Pour moi, le journal n'apparaît pas, vous pouvez m'aider?
Augusto

@Augusto Je ne peux pas vous aider ici, mais si vous posez une nouvelle question à ce sujet, les gens pourront probablement y répondre et vous aider.
hyperknot

Très bonne réponse! Cela devrait être la réponse acceptée. Connaissez-vous également un moyen de changer la couleur de cette sortie dans la console, autre que via les préférences Xcode? Ce serait bien s'il se démarquait un peu plus
Coreyd303

Merci pour l'indice! Le chemin change constamment, pour moi maintenant (iOS 13.3.1) le chemin est / Users / *** / Library / Developer / CoreSimulator / Devices / A91CEB1C-B15D-46B5-9B83-DB22056DEFD1 / data / Containers / Shared / AppGroup / B835599A- CA36-432F-871A-17EDA181CC54 / Il est donc préférable de l'obtenir à partir des informations de débogage CoreData plutôt que d'essayer de deviner vous-même.
AlKir le

52

Essayez cette étape simple en 3

  1. Copiez le code suivant dans didFinishLaunchingWithOptionsvotre appdelegate.met ajoutez un point d'arrêt avant leNSLog()

    (BOOL)application:(UIApplication *)application  
    
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSLog(@"%@",[paths objectAtIndex:0]);
     }

Ou dans Swift:

let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
print(paths[0])

entrez la description de l'image ici

2.Ouvrez Finder-> Go -> Aller au dossier et collez le chemin copié à partir de l'étape 1

entrez la description de l'image ici

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


2
Pour swift3 utiliser: NSSearchPathForDirectoriesInDomains (.applicationSupportDirectory, .userDomainMask, true)
Yohst

38

Si votre application utilise Core Data, il suffit de rechercher le fichier sqlite dans Terminal:

find ~ -name app_db_file_name.sqlite

Les résultats répertorieront le chemin complet des dossiers du simulateur contenant votre application.


2
@AlexWei Je souhaite qu'Apple ajoute un bouton dans le menu Fichier pour "Révéler le dossier de documents du simulateur dans le Finder" ou quelque chose de similaire. Cela semble ridicule que ce ne soit toujours pas là, étant donné qu'ils continuent de changer où ils stockent les fichiers ...
DiscDev

1
Dans d' autres cas sont intéressés, j'ai ajouté cette commande comme un alias à mon .profile: alias myapp_simulator_db="find ~/Library/Developer/CoreSimulator/Devices -name MyApp.sqlite". C'est pratique lorsque vous devez exécuter cette commande de manière répétitive.
toast

sudo find ~ -name app_db_file_name.sqlite m'a aidé
Qadir Hussain

21

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

Mettre à jour:

Comme quelqu'un l'a souligné ici , il est également possible de courir xcrun simctl list devicespour 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)

18

Si vous utilisez Swift , cela renverra le chemin absolu du répertoire du document:

func applicationDirectoryPath() -> String {
    return NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last! as String
}

1
Devrait être nommé "func documentDirectoryPath ()" ce que c'est là que vous allez ...
Yohst

13

J'ai écrit un script bash pour trouver l'emplacement de votre dossier Application et du dossier Application data dans un simulateur, vous pouvez le télécharger ici . Une fois que vous avez décompressé le script, vous pouvez accéder au dossier dans lequel se trouve le script et l'utiliser. Si vous l'appelez sans option, il vous donnera 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>

trouvera 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

Mettre à jour

Il existe une mise à jour du script d'origine qui vous permet de rechercher en fonction du type de périphérique à l'aide d'une option -d. J'ai également écrit un autre script qui crée une série de dossiers judicieusement nommés afin que vous puissiez trouver votre application et vos documents d'application. Ce script créera un dossier appelé iOS_SIMULATORS dans votre zone d'accueil et vous pourrez facilement accéder à votre application à partir de là.


Parfait, j'ai édité votre script pour en créer un autre qui réinitie toutes les données du simulateur d'une certaine application. Merci beaucoup James!
Martin

Merci! Excellente solution pour un PITA commun.
David Hersey

6

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

Basé sur les réponses de Michaels, c'est pour Swift 3

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

La seule solution ici!
Fattie

5

Pour Swift 3.0

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

Après de nouvelles mises à jour de Xcode, j'ai trouvé que les fichiers sql sont maintenant stockés dans un nouveau dossier, /Library/Application Supportcela pourrait être une situation unique, mais si vous n'avez pas trouvé les fichiers sql dans le dossier de document, recherchez-les ici:

~/Library/Developer/CoreSimulator/Devices/[@device_id@]/data/Containers/Data/Application/[@application_id@]/Library/Application Support/

avant qu'il ne soit stocké dans le Documentsdossier:

~/Library/Developer/CoreSimulator/Devices/[@device_id@]/data/Containers/Data/Application/[@application_id@]/Documents/


4

Pour SWIFT 3:

Copiez collez ce code dans didFinishLaunchingWithOptions

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

Cela m'a aidé. mais quand j'essaie d'accéder à ce chemin via le terminal, il dit: Aucun fichier ou répertoire de ce type, mais lorsque j'essaie d'accéder à l'option de dossier, il existe réellement.
Qadir Hussain

Cela a fonctionné pour moi sur OSX. J'avais besoin d'aller dans 1 répertoire de plus dans le répertoire "Application Support" nommé <mon nom d'application> pour affiner le fichier .sqlite.
Jacksonsox

3

Pour Swift 3

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

2

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 de nombreuses personnes qui arrivent ici, à part moi.

Contrairement à son script, le mien n'est pas un outil de recherche, il crée une structure de dossier complète (et lisible par l'homme) avec tous les périphériques / runtimes, et met des liens souples vers les 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-la simplement chaque fois que vous allez chercher une application pour une raison quelconque (elle se mettra à jour et ouvrira le dossier des appareils dans Finder).


Vous pouvez adapter ce script pour automatiser certaines choses. Mais je dois dire que cette application GUI que je viens de trouver semble être une alternative vraiment utile si vous voulez juste accéder aux dossiers de l'application :)
fbeeper

C'est aussi assez sympa mais je préfère le 2ème script posté par James Snook car il crée également des liens souples vers les répertoires de données.
David Hersey

2

Si vous n'avez spécifié aucun répertoire, vous pouvez utiliser le code ci-dessous pour imprimer le répertoire par défaut:

impression (NSPersistentContainer.defaultDirectoryURL ())


1

Car iOS 10.0+vous pouvez utiliser persistentContainer.persistentStoreCoordinator.persistentStores.first?.url

J'ai créé la fonction Utility qui copie le fichier sqlite à l'emplacement souhaité (ne fonctionne que 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

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

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

Swift 3.x

Recherchez la fonction didFinishLaunchingWithOptions dans votre fichier AppDelegate et collez -y ce code.

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

0

Swift 4.x

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

0

Swift 4.2

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

-1

Vous pouvez utiliser le code suivant.

   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    **print(persistentContainer.persistentStoreDescriptions)**
    return true
}

Il imprimera l'emplacement du stockage persistant des données de base, c'est-à-dire sqlite

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.