web-dev-qa-db-fra.com

Comment vérifier ce qui est stocké dans ma base de données principale?

Je fais une application qui s'appuie sur Core Data. Je peux saisir des données dans un champ de texte et les stocker.

Mais j'ai besoin de savoir si les données sont stockées.

J'essaye de faire un detailView à ma tableView et je n'obtiens aucun résultat. Maintenant, je me demande si c’est parce que mon code est défectueux ou que les données sont stockées correctement.

Comment voir ce qui est stocké dans la base de données CoreData de l'application?

32
jwknz

Si vous utilisez sqlite comme support de stockage pour Core Data, vous pouvez exécuter votre application dans un simulateur et essayer de vérifier le fichier de base de données situé dans le dossier Library du sandbox. 

Le chemin doit ressembler à: ~/Bibliothèque/Application Support/iPhone Simulator/5.1/Applications/3BF8A4B3-4959-4D8F-AC12-DB8EF4C3B6E1/Bibliothèque/YourAppName.sqlite

Pour ouvrir le fichier sqlite, vous avez besoin d'un outil. J'utilise un outil gratuit appelé Liya ( http://iTunes.Apple.com/us/app/liya/id455484422?mt=12 ).

22
Chris Chen

Voici ma solution (fonctionne sur iOS 9):

J'utilise un script automator/bash qui ouvre la base de données dans sqllitebrowser. le script trouve la dernière application installée dans le simulateur . Instructions:

  1. Installer le navigateur de base de données pour SQLite ( http://sqlitebrowser.org/ )
  2. Créer un nouveau flux de travail dans Apple Automator.
  3. Faites glisser "Exécuter le bloc de script Shell" et collez ce code:
cd ~/Library/Developer/CoreSimulator/Devices/
cd `ls -t | head -n 1`/data/Containers/Data/Application 
cd `ls -t | head -n 1`/Documents
open -a DB\ Browser\ for\ SQLite ./YOUR_DATABASE_NAME.sqlite

 enter image description here

  1. (Facultatif) Convertissez ce flux de travail en application, enregistrez-le et faites-le glisser vers votre dock. Pour actualiser la base de données, cliquez simplement sur l'icône de l'application.
32
Zaster

Le dossier dans lequel la base de données est stockée a récemment été modifié et n’est pas celui où vous vous attendez à le trouver. Voici ce que j'ai utilisé pour résoudre ceci: .__ D'abord, ajoutez ce code à votre viewDidLoad ou applicationDidFinishLaunching:

    #if TARGET_IPHONE_SIMULATOR
    // where are you?
    NSLog(@"Documents Directory: %@", [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);
    #endif

Vous avez ceci à partir d'ici: où se trouve le répertoire de documents du simulateur ios 8

Cela révélera l'emplacement réel de votre application dans la console lors de l'exécution . Ensuite, utilisez SQLiteBrowser pour vérifier le contenu de votre base de données SQLite.

A fonctionné à merveille pour moi ;)

10
Ivan Iliev

Swift 4

Ajouter cette ligne dans la fonction AppDelegate >> didFinishLaunchingWithOptions:

print("Documents Directory: ", FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last ?? "Not Found!")

Votre fichier modelName.sqlite sera là.

Vous pouvez l'ouvrir avec n'importe quel outil de navigateur SQLite tel que http://sqlitebrowser.org/ qui est gratuit.

9
Vahid

Comme indiqué précédemment, vous pouvez utiliser l'outil de ligne de commande sqllite.

Cependant, vous pouvez également définir l'indicateur de débogage, qui exportera toutes les commandes SQL à mesure qu'elles s'exécutent dans les données principales.

Editez le schéma et ajoutez-le dans les "Arguments passés au lancement"

-com.Apple.CoreData.SQLDebug 1

7
Jody Hagins

Dans Swift 3, vous avez le NSPersistentContainer et vous pouvez récupérer le chemin à partir de là comme ceci:

persistentContainer.persistentStoreCoordinator.persistentStores.first?.url

(En supposant que vous n'utilisez qu'un seul magasin persistant)

6
ganzogo

1) Получить путь к базе данных SQL вашего симулятора.

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSLog(@"%@", [paths objectAtIndex:0]);

2) Rechercher le Finder. НажмитеCmd+Shift+GVous trouverez tous les détails de cet article 1. Il y a 1 heure

/Users/USERNAME/Library/Developer/CoreSimulator/Devices/701BAC5F-2A42-49BA-B733-C39D563208D4/data/Containers/Data/Application/DCA9E9C7-5FEF-41EA-9255-6AE9A964053C/Documents

3) Enregistrez-vous sur l'AppStore dans la liste SQLPro .

4) Description du projet "ProjectName.sqlite".

ОРОШАЯ РАБОТА! En savoir plus sur: enter image description here

6
Nik Kov

Téléchargez le navigateur SQLite à partir de ici .

Exécutez votre application dans le simulateur. L'application doit être copiée sur un chemin sur votre Mac qui ressemble à ceci:

/Users/$your username$/Library/Application Support/iPhone Simulator/$your iphone simulator version$/Applications/

Une fois que vous avez localisé votre application, vous devez creuser plus profondément pour trouver la base de données sqlite (elle se trouve généralement sous Documents).

3
clearwater82

Une réponse pour un noobs que j'étais, j'ai passé beaucoup de temps à le comprendre . Les étapes que j'ai suivies sont les suivantes:

  1. Ouvrez le Finder et appuyez sur Command(Windows) + Shift + G.
  2. Allez dans le dossier add ~/Library/Developer
  3. Recherchez le nom de la base de données que vous avez créé, car dans mon cas, il s'agissait de my.db dans SQLite.
  4. Téléchargez et installez le navigateur de base de données pour SQLite.
  5. Cliquez sur Ouvrir la base de données.
  6. Maintenant, faites glisser le fichier de base de données à partir de votre Finder.
3
Black Mamba

En ce qui concerne macOS Sierra version 10.12.2 et XCode 8

Le dossier devrait être ici:

/Users/$username$/Library/Developer/CoreSimulator/Devices/$DeviceID$/data/Containers/Data/Application/$ApplicationID$/Library/Application Support/xyz.sqlite

3
Rock Balbao

Désolé pour la réponse tardive

je ne pouvais pas le trouver dans le dossier du simulateur d'iphone . Ensuite, j'ai découvert le dossier en imprimant le chemin d'accès à la doc dans le journal.

Code:

NSLog(@"The Path is %@", 
  [[[NSFileManager defaultManager] URLsForDirectory:
     NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);

et le chemin s'avère être comme ça:

// /Users/<username>/Library/Developer/CoreSimulator/Devices/<app specific id>/data/Containers/Data/Application/<id>/Documents/coredata.sqlite
2
Bharath Ragu

Ajoutez simplement dans viewDidLoad:

debugPrint(FileManager.default.urls(for: .documentDirectory, in: .userDomainMask))
1

Les autres solutions sont soit anciennes, soit ne vous dirigent pas facilement ou rapidement vers les fichiers SQLite. J'ai donc créé ma propre solution à l'aide de FileManager.SearchPathDirectory.applicationSupportDirectory, qui indique le chemin exact du dossier sqlite.

func whereIsMySQLite() {
    let path = FileManager
        .default
        .urls(for: .applicationSupportDirectory, in: .userDomainMask)
        .last?
        .absoluteString
        .replacingOccurrences(of: "file://", with: "")
        .removingPercentEncoding

    print(path ?? "Not found")
}

whereIsMySQLite() imprimera le chemin que vous pouvez simplement copier-coller sur votre Mac ici:

Finder> Aller> Aller au dossier

0
staticVoidMan

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.


Utilitaire pour copier des fichiers sqlite sur vos bureaux (changez le chemin du bureau et donnez le chemin absolu, le symbole ~ ne fonctionnera pas.

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 utiliser cet utilitaire comme

import CoreData


let appDelegate = UIApplication.shared.delegate as! AppDelegate
UTility.getSqliteTo(destinationPath: "/Users/inderkumarrathore/Desktop", persistentContainer: appDelegate.persistentContainer)

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