Datos básicos de ubicación de archivos Sqlite

Normalmente, el archivo de tienda sqlite para aplicaciones de datos centrales se encuentra en

Biblioteca> Soporte de aplicación> iPhone Simulator> 7.1 (o la versión que esté utilizando)> Aplicaciones> (Cualquiera que sea la carpeta que contenga su aplicación)> Documentos

carpeta, pero no puedo encontrarlo en IOS 8. Asumiría que solo agregarían una carpeta 8.0 dentro de la carpeta de iPhone Simulator, pero no está allí. ¿Alguien ha sido capaz de localizarlo?

Logré localizar el archivo sqlite, y ahora está en esta ruta:

Biblioteca / Desarrollador / CoreSimulator / Devices / (números y letras) / data / Containers / Data / Application / (números y letras) / Documents /

(números y letras) representa una carpeta que sería exclusiva de su aplicación / computadora, pero se vería así: 779AE2245-F8W2-57A9-8C6D-98643B1CF01A

Pude encontrarlo yendo a appDelegate.m, desplazándome hacia abajo

- (NSURL *)applicationDocumentsDirectory 

método y NSLogging la ruta de retorno, así:

 // 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]; } 

Esto le dará su camino único, haciéndolo más fácil, porque es complicado ubicarlo con las 2 carpetas / cadenas de letras y números sin nombre.

Prueba este Simple 3 Step

  1. Copie el siguiente código en didFinishLaunchingWithOptions your appdelegate.m y agregue un punto de interrupción antes de NSLog()

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

O en Swift:

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

enter image description here

2. Abre Finder-> Ir -> Ir a la carpeta y pegar la ruta copiada desde el paso 1

enter image description here

3. ¡Yah! Estás en tu Destino.

Si su aplicación está utilizando Core Data, solo es cuestión de buscar el archivo sqlite en Terminal:

 find ~ -name app_db_file_name.sqlite 

Los resultados mostrarán la ruta completa a las carpetas del simulador que contiene su aplicación.

Ninguna de las respuestas mencionó la forma más sencilla de obtener realmente la ubicación del archivo DB.

Ni siquiera requiere que modifique su código fuente, ya que es un simple cambio de tiempo de ejecución en XCode.

  1. Elija Editar esquema … al lado del botón Ejecutar.

    editar esquema

  2. Seleccione Ejecutar / Argumentos y agregue las siguientes dos opciones:

     -com.apple.CoreData.SQLDebug 1 -com.apple.CoreData.Logging.stderr 1 

    opción

  3. Ejecute la aplicación, y verá en los registros:

    registros

Hackeé este 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'" \; 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'" \;

Esto 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 

Actualizar:

Como alguien señaló aquí , también es posible ejecutar xcrun simctl list devices para obtener un resultado similar:

 == 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) 

Si está utilizando Swift , esto devolverá la ruta absoluta del directorio de documentos:

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

Escribí un script bash para encontrar la ubicación de su carpeta de aplicaciones y la carpeta de datos de la aplicación dentro de un simulador, puede descargarlo aquí . Una vez que haya descomprimido el script, puede navegar a la carpeta donde está el script y usarlo. Si lo llamas sin opciones, te dará una lista de los simuladores de iOS instalados. Luego puede usar las opciones para encontrar su progtwig. Escritura:

 ./simulatorAppFolders -s "iPad Air" -i iOS-8-0 -a  

encontrará la carpeta de la aplicación y la carpeta del área local de su aplicación en el simulador de iPad Air iOS 8. Aquí hay un ejemplo:

 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 

Actualizar

Hay una actualización del script original que le permite buscar según el tipo de dispositivo usando una opción -d. También escribí otro script que crea una serie de carpetas con nombres sensatos para que pueda encontrar su aplicación y documentos de aplicación. Este script creará una carpeta llamada iOS_SIMULATORS en su área de origen y desde allí podrá navegar fácilmente a su aplicación.

Pude localizar la carpeta de simuladores con la siguiente salida de consola:

 NSLog(@"app dir: %@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]); 

en mi caso fue (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/ 

Basado en las respuestas de Michaels, esto es para Swift 3

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

Para Swift 3.0

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

puedes obtener la ubicación de Coredata en Xcode 8.2

Para SWIFT 3:

Copie y pegue este código en didFinishLaunchingWithOptions

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

Al igual que James Snook , creé mi propia secuencia de comandos para proporcionar un acceso más fácil a las aplicaciones del simulador. Creo que puede ser útil para muchas personas que llegan aquí, aparte de mí.

A diferencia de su guión, el mío no es una herramienta de búsqueda, sino que crea una estructura de carpetas completa (y legible para el ser humano) con todos los dispositivos / tiempos de ejecución, y pone enlaces suaves a las aplicaciones en ellos.

Puedes obtenerlo en este Gist .

Ejecútelo cada vez que instale una aplicación en el simulador o simplemente ejecútelo cada vez que vaya a buscar una aplicación por algún motivo (se actualizará y abrirá la carpeta de dispositivos en Finder).

Para veloz 3

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

Después de las nuevas actualizaciones de Xcode, descubrí que los archivos sql ahora están almacenados en una nueva carpeta /Library/Application Support Esta podría ser una situación única, pero si no encontró los archivos sql en la carpeta del documento, búsquelos aquí:

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

antes de que se almacenara en Documents carpeta Documents :

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

Si no ha especificado ningún directorio, puede usar el siguiente código para imprimir el directorio predeterminado:

print (NSPersistentContainer.defaultDirectoryURL ())

Para iOS 10.0+ , puede usar persistentContainer.persistentStoreCoordinator.persistentStores.first?.url

He creado la función de utilidad que copia el archivo sqlite en la ubicación deseada (funciona solo para el simulador).

Puedes usarlo como

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

Si ya tiene acceso a los archivos sqlite, shm y wal, ejecute los comandos en el terminal para combinar el archivo WAL en el archivo sqlite.

 $ sqlite3 persistentStore sqlite> PRAGMA wal_checkpoint; Press control + d 

Después de ejecutar los comandos anteriores, puede ver los datos en su archivo sqlite.


Aquí está la definición de método de utilidad para 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") } 

Para objective-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"); } 

Swift 3.x

Ubique la función didFinishLaunchingWithOptions en su archivo AppDelegate y pase este código allí.

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

Swift 4.x

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