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?
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 ).
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:
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
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 ;)
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.
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
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)
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".
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).
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:
Command(Windows) + Shift + G
.~/Library/Developer
my.db
dans SQLite.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
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
Ajoutez simplement dans viewDidLoad:
debugPrint(FileManager.default.urls(for: .documentDirectory, in: .userDomainMask))
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
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.
~
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");
}