In Xcode 6 habe ich eine App, in der ich Core Data verwende, aber es gibt keinen Ordner in der Anwendungsunterstützung für den iOS 8 iPhone Simulator. Wo werden meine Dateien und die Core Data SQLite-Datenbank gespeichert?
In Xcode 6 habe ich eine App, in der ich Core Data verwende, aber es gibt keinen Ordner in der Anwendungsunterstützung für den iOS 8 iPhone Simulator. Wo werden meine Dateien und die Core Data SQLite-Datenbank gespeichert?
Antworten:
Das Simulatorverzeichnis wurde mit Xcode 6 Beta nach ...
~/Library/Developer/CoreSimulator
Das Durchsuchen des Verzeichnisses in den Ordner "Dokumente" Ihrer App ist etwas schwieriger, z.
~/Library/Developer/CoreSimulator/Devices/4D2D127A-7103-41B2-872B-2DB891B978A2/data/Containers/Data/Application/0323215C-2B91-47F7-BE81-EB24B4DA7339/Documents/MyApp.sqlite
~/Library/Developer/CoreSimulator/Devices/B2C6629C-998D-4E84-9ADB-06CAF5BA4B89/data/Containers/Data/Application/62593001-FADA-4647-AA80-FE9973956C05/Documents/
#if DEBUG NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"]; NSString *aliasPath = [NSString stringWithFormat:@"XCodePaths/%@", appName]; remove([aliasPath UTF8String]); [[NSFileManager defaultManager]createSymbolicLinkAtPath:aliasPath withDestinationPath:DOCS_DIR error:nil]; #endif
Jetzt habe ich einen Simlink, der funktioniert, obwohl iOS8 + XCode6 die Daten-GUID meiner App bei jedem Erstellen ändert.
xcrun simctl list
Befehl kann die Entsprechung zwischen den Simulatornamen und den Geräte-UDIDs angezeigt werden. Oder genauer gesagt der xcrun simctl list devices
Befehl.
Ich würde vorschlagen, dass Sie SimPholders verwenden , um Ihre Simulator-Dateien zu finden. Es ist ein Menüleistenelement, mit dem Sie Ihre Simulator-Apps verfolgen und direkt zu deren Ordnern und Inhalten wechseln können. Es ist toll.
Ich fand die SimulatorManager- Anwendung sehr nützlich. Sie gelangen direkt zum Anwendungsordner der installierten Simulatoren. Ich habe es mit 7.1, 8.0 und 8.1 Simulatoren versucht.
SimulatorManager befindet sich als Symbol in der Taskleiste und bietet eine Option zum Starten bei Anmeldung.
Hinweis : Dies funktioniert nur mit Xcode 6 (in meinem Fall 6.1.1) und höher.
Hoffentlich hilft das!
Fügen Sie den folgenden Code hinzu, um zu erfahren, wo Ihre .sqlite-Datei in AppDelegate.m gespeichert ist
- (NSURL *)applicationDocumentsDirectory
{
NSLog(@"%@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
Rufen Sie diese Methode jetzt in AppDelegate.m auf
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//call here
[self applicationDocumentsDirectory];
}
Ich habe einige Zeit damit gerungen. Es wurde ein großer Schmerz, einfach zu meiner lokalen SQLite-Datenbank zu gelangen. Ich habe dieses Skript geschrieben und es zu einem Code-Snippet in XCode gemacht. Ich platziere es in meinem appDidFinishLaunching in meinem appDelegate.
//xcode 6 moves the documents dir every time. haven't found out why yet.
#if DEBUG
NSLog(@"caching documents dir for xcode 6. %@", [NSBundle mainBundle]);
NSString *toFile = @"XCodePaths/lastBuild.txt"; NSError *err = nil;
[DOCS_DIR writeToFile:toFile atomically:YES encoding:NSUTF8StringEncoding error:&err];
if(err)
NSLog(@"%@", [err localizedDescription]);
NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"];
NSString *aliasPath = [NSString stringWithFormat:@"XCodePaths/%@", appName];
remove([aliasPath UTF8String]);
[[NSFileManager defaultManager] createSymbolicLinkAtPath:aliasPath withDestinationPath:DOCS_DIR error:nil];
#endif
Dadurch wird ein Simlink im Stammverzeichnis Ihres Laufwerks erstellt. (Möglicherweise müssen Sie diesen Ordner beim ersten Mal selbst erstellen und ändern, oder Sie können den Speicherort an einen anderen Ort ändern.) Dann habe ich das xcodeway- Plugin https://github.com/onmyway133/XcodeWay installiert
Ich habe es ein wenig geändert, damit ich einfach cmd + d drücken kann, und es wird ein Finder-Winder für das persistente Dokumentenverzeichnis meiner aktuellen Anwendung geöffnet. Unabhängig davon, wie oft XCode Ihren Pfad ändert, ändert es sich auf diese Weise nur beim Ausführen und aktualisiert Ihren Simlink sofort bei jedem Ausführen.
Ich hoffe das ist nützlich für andere!
Öffnen Sie den Finder> Bibliothek> Entwickler> CoreSimulator> Geräte
Dann ändern Sie das Arrangement-Symbol im Finder und wählen Sie das Datum des Hinzufügens
Wählen Sie Ihre App> Daten> Container> Daten> Anwendungen>
Wählen Sie Ihre App> Dokumente> Hier ist Ihre Datenbankdatei
In meinem Fall:
/Users/pluto/Library/Developer/CoreSimulator/Devices/A75107D2-A535-415A-865D-978B2555370B/data/Containers/Data/Application/265A12BC-FF5B-4235-B5EF-6022B83754B4/Documents/dboPhotoBucket.sqlite
Andernfalls machen Sie Folgendes:
NSLog(@"app dir: %@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);
- Es wird der vollständige Pfad zum Datenordner gedruckt.
Schnell:
let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
println("App Path: \(dirPaths)")
let dirPaths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) print("App Path: \(dirPaths)")
Verwenden Sie den Finder -> gehen Sie zum Ordner und geben Sie den angegebenen Basispfad ein, um zu den Anwendungsordnern zu gelangen
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSLog(@"%@",basePath);
Der Simulator legt die Datei in ~ / Library / Developer / CoreSimulator / Devices / ... ab, aber der Pfad nach / Devices ist für alle unterschiedlich.
Verwenden Sie diese praktische Methode. Es gibt den Pfad des temporären Verzeichnisses für den aktuellen Benutzer zurück und akzeptiert kein Argument.
NSString * NSTemporaryDirectory ( void );
In meiner ViewController-Klasse füge ich diese Zeile normalerweise in mein viewDidLoad ein, nur als Referenz, wenn ich meine gespeicherte CoreData-Datei abrufen muss. Hoffe das hilft.
NSLog(@"FILE PATH :%@", NSTemporaryDirectory());
(Hinweis: Um zum Pfad zu gelangen, klicken Sie im Finder-Menü auf Los und geben Sie ~ / Library ein, um das versteckte Verzeichnis zu öffnen. Klicken Sie dann im Finder-Fenster auf den Pfad, der auf Ihrer Konsole angezeigt wird.)
Dieser Speicherort hat sich erneut geändert. Wenn Sie Swift verwenden, können Sie anhand dieses Speicherorts herausfinden, wo sich der Ordner befindet (dieser wird aus der von Apple für Sie erstellten Datei AppDelegate.swift kopiert. Wenn er auf Ihrem Computer nicht funktioniert, suchen Sie in Diese Datei für die richtige Syntax funktioniert bei mir mit Xcode 6.1 und iOS 8 Simulator.
let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
println("Possible sqlite file: \(urls)")
Die Simulatoren befinden sich unter:
~/Library/Developer/CoreSimulator/
Hier werden sie als Verzeichnisse mit UUID-Namen aufgelistet. Verwenden Sie die Sortierung nach 'Änderungsdatum', um das neueste zu finden. Innen navigieren zu:
/data/Containers/Data/Application/
Hier erhalten Sie eine Liste aller Anwendungen auf diesem Gerät. Sie können dies erneut sortieren, um die neueste App zu erhalten.
HINWEIS: Xcode ändert den Verzeichnisnamen jedes Mal, wenn Sie die App ausführen. Verlassen Sie sich daher nicht darauf, Alias / Verknüpfungen auf dem Desktop zu erstellen.
Der einfachste Weg ist es, die App nutzen hier , was alles automatisch tut.
Ich habe dieses Skript erstellt, das die neueste App für jeden Simulator komprimiert und auf den Desktop komprimiert.
https://gist.github.com/Gerst20051/8ca49d5afbf09007b3696fab6e9f425c
#!/bin/bash
DESTINATION_DIR="$HOME/Desktop"
APP_PATH=$(find ~/Library/Developer/CoreSimulator/Devices/*/data/Containers/Bundle/Application/*/*.app -type d -maxdepth 0 -print0 | xargs -0 ls -td | head -n1)
APP_DIRNAME=$(dirname "$APP_PATH")
APP_BASENAME=$(basename "$APP_PATH")
FILE_NAME="${APP_BASENAME%.*}"
cd "$APP_DIRNAME"
zip -qr "$DESTINATION_DIR/$FILE_NAME.zip" "$APP_BASENAME"
In Swift 4 oder Swift 5 können Sie verwenden NSHomeDirectory()
.
Der einfachste Weg in Xcode 10 (oder Xcode 11) besteht darin, die App anzuhalten (z. B. wenn sie einen Haltepunkt erreicht) und diese Zeile in der Debugger-Konsole auszuführen:
po NSHomeDirectory()
po
steht für Druckobjekt und druckt die meisten Dinge
1. NSTemporaryDirectory() gives this:
/Users/spokaneDude/Library/Developer/CoreSimulator/Devices/1EE69744-255A-45CD-88F1-63FEAD117B32/data/Containers/Data/Application/199B1ACA-A80B-44BD-8E5E-DDF3DCF0D8D9/tmp
2. remove "/tmp" replacing it with "/Library/Application Support/<app name>/" --> is where the .sqlite files reside
Mit Swift 4 können Sie den folgenden Code verwenden, um das Home-Verzeichnis Ihrer App abzurufen. Dort befindet sich das Dokumentverzeichnis Ihrer App.
print(NSHomeDirectory())
Ich denke, Sie wissen bereits, dass das Home-Verzeichnis Ihrer App geändert werden kann. Wenn Sie also Ihrer Codebasis keinen zusätzlichen Code hinzufügen möchten, ist SimPholder ein nützliches Tool für Sie.
Darüber hinaus fragen Sie sich vielleicht, ob es ein Tool gibt, mit dem Sie Zeit sparen können, wenn Sie die SQLite-Datenbank jedes Mal schließen und erneut öffnen, nachdem das Home-Verzeichnis Ihrer App geändert wurde. Und die Antwort lautet: Ja, ein Tool, das ich kenne, ist SQLiteFlow . Aus dem Dokument geht hervor, dass:
Behandeln Sie Datenbankdateinamen oder Verzeichnisänderungen. Dadurch kann SQLiteFlow mit Ihrer SQLite-Datenbank im iOS-Simulator kompatibel arbeiten.
Hier ist der sh für den zuletzt verwendeten Simulator und die zuletzt verwendete Anwendung. Führen Sie einfach sh aus und kopieren Sie den gedruckten Text und fügen Sie den Befehl zum Anzeigen im Finder ein und führen Sie ihn aus.
#!/bin/zsh
lastUsedSimulatorAndApplication=`ls -td -- ~/Library/Developer/CoreSimulator/Devices/*/data/Containers/Data/Application/*/ | head -n1`
echo $lastUsedSimulatorAndApplication