Datos principales de ubicación de archivos SQL

91

Normalmente, el archivo de la tienda sqlite para las aplicaciones de datos principales se encuentra en

Biblioteca> Soporte de aplicaciones> Simulador de iPhone> 7.1 (o la versión que esté usando)> Aplicaciones> (La carpeta que contenga su aplicación)> Documentos

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

enlyte
fuente
2
Estoy bastante seguro de que su pregunta es un duplicado, considerando que la hice más de una semana antes de que se preguntara la suya. Le agradeceríamos que me permitiera obtener el crédito por esta pregunta, considerando que es la primera pregunta que he hecho, y parece que ya tiene una reputación @HenryGlendening
enlyte
Vea cómo verificar dbpath stackoverflow.com/a/27358291/3840428
Nagarjun
Siga este ... stackoverflow.com/questions/24290989/…
Tunvir Rahman Tusher
2
¿Alguien sabe cómo obtener los archivos CoreData del dispositivo real? Solía ​​hacer esto a través de iTunes en versiones anteriores de Xcode, pero desde Xcode 8 / iOS10 no creo que los archivos CoreData estén almacenados en el directorio de documentos de la aplicación, por lo tanto, no son visibles en iTunes. ¿Hay alguna forma de obtener los archivos CoreDate del dispositivo en su computadora?
Bocaxica
1
No sé por qué siguen moviendo esto. Deberían ponerlo en algún lugar y dejarlo.
RegularExpression

Respuestas:

135

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

Biblioteca / Desarrollador / CoreSimulator / Dispositivos / (números y letras) / datos / Contenedores / Datos / Aplicación / (números y letras) / Documentos /

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

Pude encontrarlo yendo a appDelegate.m, desplazándome hasta el

- (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 ruta única, haciéndolo más fácil para usted, porque es complicado ubicarlo con las 2 carpetas / cadenas de letras y números sin nombre.

Rápido 4.2:

let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
print(paths[0])
enlyte
fuente
4
Úselo xcrun simctl listpara obtener la lista de nombres de simuladores y sus UUID.
Sandy Chapman
1
Tenga en cuenta que si usa una base de datos compartida para un grupo de aplicaciones (por ejemplo, cuando usa una extensión), la ruta es Library / Developer / CoreSimulator / Devices / $ number / data / Containers / Shared / AppGroup / $ number / Name.sqlite
andreacipriani
7
Tenga en cuenta que, en 2019 , Library/Developer/CoreSimulator/Devices/(numbers and letters)/data/Containers/Data/Application/(numbers and letters)/Documents/ya no es cierto. Ahora encontrará el .sqlite y dos archivos relacionados enLibrary/Developer/CoreSimulator/Devices/(numbers and letters)/data/Containers/Data/Application/(numbers and letters)/Library/Application Support/
Gang Fang
@GangFang Estoy tratando de convertir mi código Objective C que está construido en Xcode 7 a la última versión rápida y crear un nuevo proyecto, entonces, ¿cómo puedo migrar estos dos archivos .sqlite diferentes a un solo lugar?
Sanjay Shah
85

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

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

  1. Elija Editar esquema ... junto al 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

hipernudo
fuente
2
De hecho, esta es la mejor y más simple solución. ¡Gracias!
Omid Ariyan
Para mí no aparece el log, ¿me pueden ayudar?
Augusto
@Augusto No puedo ayudarte aquí, pero si haces una nueva pregunta al respecto, la gente probablemente pueda responderla y ayudarte.
hipernudo
¡Gran respuesta! Esta debería ser la respuesta aceptada. Además, ¿hay alguna forma que conozca de cambiar el color de esta salida en la consola, además de a través de las preferencias de Xcode? Sería bueno si se destacara un poco más
Coreyd303
¡Gracias por la pista! La ruta cambia constantemente, para mí ahora (iOS 13.3.1) la ruta es / Users / *** / Library / Developer / CoreSimulator / Devices / A91CEB1C-B15D-46B5-9B83-DB22056DEFD1 / data / Containers / Shared / AppGroup / B835599A- CA36-432F-871A-17EDA181CC54 / Por lo tanto, es mejor obtenerlo de la información de depuración de CoreData en lugar de intentar adivinarlo usted mismo.
AlKir
52

Prueba este sencillo paso de 3

  1. Copie el siguiente código en didFinishLaunchingWithOptionssu appdelegate.my agregue un punto de interrupción antes delNSLog()

    (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])

ingrese la descripción de la imagen aquí

2.Abrir Finder-> Ir -> Ir a la carpeta y pegar la ruta copiada del paso 1

ingrese la descripción de la imagen aquí

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

Tunvir Rahman Tusher
fuente
2
Para uso de swift3: NSSearchPathForDirectoriesInDomains (.applicationSupportDirectory, .userDomainMask, true)
Yohst
38

Si su aplicación usa 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 contienen su aplicación.

DiscDev
fuente
2
@AlexWei Deseo que Apple agregue un botón en el menú Archivo a "Revelar carpeta de documentos del Simulador en el buscador" o algo similar. Parece ridículo que todavía no esté allí, considerando que siguen cambiando el lugar donde almacenan los archivos ...
DiscDev
1
En caso de que otros están interesados, añadí este comando como un alias a mi .profile: alias myapp_simulator_db="find ~/Library/Developer/CoreSimulator/Devices -name MyApp.sqlite". Es útil cuando necesita ejecutar repetidamente este comando.
brindis el
sudo find ~ -name app_db_file_name.sqlite me ayudó
Qadir Hussain
21

Hackeé esta frase de una sola línea ( 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'" \;

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 devicespara 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)
Alejandro
fuente
18

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

func applicationDirectoryPath() -> String {
    return NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last! as String
}
Mike Rapadas
fuente
1
Debería llamarse "func documentDirectoryPath ()" lo que es a donde va ...
Yohst
13

Escribí un script bash para encontrar la ubicación de la carpeta de la aplicación 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 en la que se encuentra el script y usarlo. Si lo llama sin opciones, le dará una lista de simuladores iOS instalados. Luego puede usar las opciones para encontrar su programa. Escritura:

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

encontrará la carpeta de la aplicación y la carpeta del área de inicio para su aplicación en el simulador de iPad Air iOS 8. He aquí 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 razonables para que pueda encontrar su solicitud y los documentos de la solicitud. Este script creará una carpeta llamada iOS_SIMULATORS en su área de inicio y puede navegar fácilmente a su aplicación desde allí.

James Snook
fuente
Perfecto, edité tu script para hacer otro que reinicia todos los datos del simulador de una determinada aplicación. ¡Muchas gracias James!
Martin
¡Gracias! Gran solución para un PITA común.
David Hersey
6

Pude ubicar la carpeta de simuladores con la siguiente salida de la 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/
virus
fuente
6

Según las respuestas de Michaels, esto es para Swift 3

    func applicationDirectoryPath() -> String {
        return NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! as String
    }
Jochen Bedersdorfer
fuente
¡La única solución aquí!
Fattie
5

Para Swift 3.0

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

puede obtener la ubicación de Coredata en Xcode 8.2

Tecnología
fuente
5

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

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

antes de que se almacenara en la Documentscarpeta:

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

Nazir
fuente
4

Para SWIFT 3:

Copia y pega este código en didFinishLaunchingWithOptions

 print(NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true).last! as String)
Sandu
fuente
Eso me ayudó. pero cuando trato de ir a esa ruta a través de la terminal, dice: No existe ese archivo o directorio, pero cuando trato de ir a la opción de carpeta, realmente existe.
Qadir Hussain
Esto funcionó para mí en OSX. Necesitaba ir a 1 directorio más dentro del directorio "Soporte de aplicaciones" llamado <nombre de mi aplicación> para corregir el archivo .sqlite.
Jacksonsox
3

Para swift 3

print(NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true).last! as String)
Andrew Shon
fuente
2

Como James Snook , creé mi propio script para proporcionar un acceso más fácil a las aplicaciones del simulador. Creo que puede ser útil para muchas personas que llegan aquí, además de mí.

A diferencia de su script, el mío no es una herramienta de búsqueda, crea una estructura de carpetas completa (y legible por humanos) con todos los dispositivos / tiempos de ejecución, y coloca enlaces suaves a las aplicaciones en ellos.

Puedes conseguirlo 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 cualquier motivo (se actualizará y abrirá la carpeta de dispositivos en Finder).

fbeeper
fuente
Puede adaptar este script para automatizar algunas cosas. Pero debo decir que esta aplicación GUI que acabo de encontrar suena como una alternativa realmente útil si solo desea acceder a las carpetas de la aplicación :)
fbeeper
Esto también es bastante bueno, pero prefiero el segundo script publicado por James Snook, ya que también crea enlaces suaves a los directorios de datos.
David Hersey
2

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

imprimir (NSPersistentContainer.defaultDirectoryURL ())

Ashutosh Shukla
fuente
1

Porque iOS 10.0+puedes usar persistentContainer.persistentStoreCoordinator.persistentStores.first?.url

He creado la función de utilidad que copia el archivo sqlite a 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 la terminal para fusionar 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

/**
 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")      
}

por

/**
 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");
}
Inder Kumar Rathore
fuente
0

Swift 3.x

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

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

Swift 4.x

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

Rápido 4.2

let paths = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
        print(paths[0])
Divesh singh
fuente
-1

Puede utilizar el siguiente código.

   func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    **print(persistentContainer.persistentStoreDescriptions)**
    return true
}

Imprimirá la ubicación del almacenamiento persistente de datos centrales, es decir, sqlite

Piyush
fuente