Zazwyczaj plik sklepu sqlite dla podstawowych aplikacji danych znajduje się w
Biblioteka> Obsługa aplikacji> Symulator iPhone'a> 7.1 (lub dowolna wersja, której używasz)> Aplikacje> (Którykolwiek folder zawiera Twoją aplikację)> Dokumenty
folderu, ale nie mogę go znaleźć w IOS 8. Przypuszczam, że po prostu dodaliby folder 8.0 do folderu iPhone Simulator, ale go tam nie ma. Czy ktoś był w stanie to zlokalizować?
Odpowiedzi:
Udało mi się zlokalizować plik sqlite i jest teraz w tej ścieżce:
(cyfry i litery) oznacza folder, który byłby unikalny dla Twojej aplikacji / komputera, ale wyglądałby tak: 779AE2245-F8W2-57A9-8C6D-98643B1CF01A
Udało mi się go znaleźć, przechodząc do appDelegate.m, przewijając w dół do
- (NSURL *)applicationDocumentsDirectory
metoda i NSLogging ścieżkę powrotu, na przykład:
// 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]; }
To da ci unikalną ścieżkę, ułatwiając ci to, ponieważ zlokalizowanie jej za pomocą 2 nienazwanych folderów / ciągów liter i cyfr jest trudne.
Swift 4.2:
let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true) print(paths[0])
źródło
xcrun simctl list
aby uzyskać listę nazw symulatorów i ich identyfikatorów UUID.Library/Developer/CoreSimulator/Devices/(numbers and letters)/data/Containers/Data/Application/(numbers and letters)/Documents/
nie jest już prawdą. Teraz znajdziesz .sqlite i dwa powiązane plikiLibrary/Developer/CoreSimulator/Devices/(numbers and letters)/data/Containers/Data/Application/(numbers and letters)/Library/Application Support/
Żadna z odpowiedzi nie wspomniała o najprostszym sposobie uzyskania lokalizacji pliku DB.
Nie wymaga nawet modyfikowania kodu źródłowego, ponieważ jest to prosty przełącznik czasu wykonywania w XCode.
Wybierz Edytuj schemat ... obok przycisku Uruchom.
Wybierz Uruchom / Argumenty i dodaj następujące dwie opcje:
-com.apple.CoreData.SQLDebug 1 -com.apple.CoreData.Logging.stderr 1
Uruchom aplikację, a zobaczysz w dziennikach:
źródło
Wypróbuj ten prosty 3 krok
Skopiuj następujący kod do
didFinishLaunchingWithOptions
swojegoappdelegate.m
i dodaj punkt przerwania przedNSLog()
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSLog(@"%@",[paths objectAtIndex:0]); }
Lub w Swift:
let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) print(paths[0])
2.Otwórz Finder-> Idź -> Idź do folderu i wklej ścieżkę skopiowaną z kroku 1
3. Tak !!! Jesteś w miejscu docelowym.
źródło
Jeśli Twoja aplikacja korzysta z podstawowych danych, wystarczy wyszukać plik sqlite w Terminalu:
find ~ -name app_db_file_name.sqlite
Wyniki będą zawierać pełną ścieżkę do folderów symulatora zawierających Twoją aplikację.
źródło
alias myapp_simulator_db="find ~/Library/Developer/CoreSimulator/Devices -name MyApp.sqlite"
. Jest to przydatne, gdy trzeba wielokrotnie uruchamiać to polecenie.Zhakowałem ten jeden wiersz ( streszczenie ):
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'" \;
To drukuje:
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
Aktualizacja:
Jak ktoś tu zaznaczył , można też biec,
xcrun simctl list devices
aby uzyskać podobny wynik:== 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)
źródło
Jeśli używasz Swift , zwróci to bezwzględną ścieżkę katalogu dokumentu:
func applicationDirectoryPath() -> String { return NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last! as String }
źródło
Napisałem skrypt bash do znajdowania lokalizacji folderu aplikacji i folderu danych aplikacji w symulatorze, możesz go pobrać tutaj . Po rozpakowaniu skryptu możesz przejść do folderu, w którym znajduje się skrypt, i użyć go. Jeśli zadzwonisz bez opcji, wyświetli się lista zainstalowanych symulatorów iOS. Następnie możesz użyć opcji, aby znaleźć swój program. Pisanie:
./simulatorAppFolders -s "iPad Air" -i iOS-8-0 -a <MyApp>
znajdzie folder aplikacji i folder obszaru domowego dla Twojej aplikacji na symulatorze iPada Air iOS 8. Oto przykład:
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
Aktualizacja
Dostępna jest aktualizacja oryginalnego skryptu, która umożliwia wyszukiwanie na podstawie typu urządzenia przy użyciu opcji -d. Napisałem również inny skrypt, który tworzy serię rozsądnie nazwanych folderów, dzięki czemu można znaleźć swoją aplikację i dokumenty aplikacji. Ten skrypt utworzy folder o nazwie iOS_SIMULATORS w Twoim obszarze domowym, z którego możesz łatwo przejść do aplikacji.
źródło
Udało mi się zlokalizować folder symulatorów z następnym wyjściem konsoli:
NSLog(@"app dir: %@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);
w moim przypadku było to (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/
źródło
Na podstawie odpowiedzi Michaelsa dotyczy to Swift 3
func applicationDirectoryPath() -> String { return NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! as String }
źródło
Dla Swift 3.0
let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true) print(paths[0])
możesz uzyskać lokalizację Coredata w Xcode 8.2
źródło
Po nowych aktualizacjach Xcode odkryłem, że pliki sql są teraz przechowywane w nowym folderze,
/Library/Application Support
może to być wyjątkowa sytuacja, ale jeśli nie znalazłeś plików sql w folderze dokumentów, wyszukaj je tutaj:~/Library/Developer/CoreSimulator/Devices/[@device_id@]/data/Containers/Data/Application/[@application_id@]/Library/Application Support/
przed zapisaniem w
Documents
folderze:~/Library/Developer/CoreSimulator/Devices/[@device_id@]/data/Containers/Data/Application/[@application_id@]/Documents/
źródło
W przypadku SWIFT 3:
Skopiuj, wklej ten kod w didFinishLaunchingWithOptions
print(NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true).last! as String)
źródło
Dla szybkiego 3
print(NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true).last! as String)
źródło
Jak James Snook stworzyłem własny skrypt, aby zapewnić łatwiejszy dostęp do aplikacji symulatora. Myślę, że może to być przydatne dla wielu ludzi, którzy się tu dostają, poza mną.
W przeciwieństwie do jego skryptu, mój nie jest narzędziem wyszukiwania, tworzy kompletną (i czytelną dla człowieka) strukturę folderów ze wszystkimi urządzeniami / środowiskami wykonawczymi i umieszcza miękkie linki do znajdujących się w nich aplikacji.
Możesz to zdobyć w tym streszczeniu .
Uruchom go za każdym razem, gdy instalujesz aplikację w symulatorze lub po prostu uruchamiaj go za każdym razem, gdy chcesz pobrać aplikację z dowolnego powodu (zaktualizuje się i otworzy folder urządzeń w Finderze).
źródło
Jeśli nie określiłeś żadnego katalogu, możesz użyć poniższego kodu, aby wydrukować domyślny katalog:
print (NSPersistentContainer.defaultDirectoryURL ())
źródło
Dla
iOS 10.0+
można użyćpersistentContainer.persistentStoreCoordinator.persistentStores.first?.url
Stworzyłem funkcję Utility, która kopiuje plik sqlite do wybranej lokalizacji (działa tylko dla symulatora).
Możesz go używać jak
import CoreData let appDelegate = UIApplication.shared.delegate as! AppDelegate UTility.getSqliteTo(destinationPath: "/Users/inderkumarrathore/Desktop", persistentContainer: appDelegate.persistentContainer)
Jeśli masz już dostęp do plików sqlite, shm i wal, uruchom polecenia w terminalu, aby scalić plik WAL z plikiem sqlite.
$ sqlite3 persistentStore sqlite> PRAGMA wal_checkpoint; Press control + d
Po uruchomieniu powyższych poleceń możesz zobaczyć dane w swoim pliku sqlite.
Oto definicja metody użyteczności dla szybki
/** 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") }
Dla cel 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"); }
źródło
Swift 4.2
Stworzyłem rozszerzenie dla
NSPersistentStoreDescription
import CoreData extension NSPersistentStoreDescription { func getDatabaseLocation() -> String? { return self .url? .absoluteString .replacingOccurrences(of: "file://", with: "") // Remove file suffix .replacingOccurrences(of: "%20", with: "\\ ") // Make the spaces to support terminal paste } }
Następnie używam go podczas inicjalizacji
NSPersistentContainer
lazy var persistentContainer: NSPersistentContainer = { let container = NSPersistentContainer(name: "CoreDataDemo") container.loadPersistentStores(completionHandler: { (storeDescription, error) in #if DEBUG debugPrint(storeDescription.getDatabaseLocation() ?? "No database location") #endif if let error = error as NSError? { assertionFailure("Unresolved error \(error), \(error.userInfo)") } }) return container }()
źródło
Swift 3.x
Znajdź funkcję didFinishLaunchingWithOptions w pliku AppDelegate i wklej tam ten kod.
let path = NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true) print("\(path)")
źródło
Swift 4.x
let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true) print(paths[0])
źródło
Swift 4.2
let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true) print(paths[0])
źródło
Możesz użyć następującego kodu.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. **print(persistentContainer.persistentStoreDescriptions)** return true }
Wyświetli lokalizację podstawowego trwałego magazynu danych, tj. Sqlite
źródło