Sqlite Расположение файла Основные данные

68

Как правило, файл хранилища sqlite для приложений с основными данными находится в

Библиотекa > Поддержка приложений > iPhone Simulator > 7.1 (или в зависимости от того, какую версию вы используете) > Приложения > (какая папка содержит ваше приложение) > Документы

но я не могу найти его в IOS 8. Я бы предположил, что они просто добавят папку 8.0 внутри папки iPhone Simulator, но ее там нет. Кто-нибудь мог найти его?

  • 2
    Я почти уверен, что ваш вопрос является дубликатом, учитывая, что я задал его за неделю до того, как был задан ваш. Буду признателен, если вы позволите мне получить кредит на этот вопрос, учитывая, что это первый вопрос, который я когда-либо задавал, и кажется, что у вас уже есть репутация @HenryGlendening
  • 0
    Проверьте это, как проверить dbpath stackoverflow.com/a/27358291/3840428
Показать ещё 3 комментария
Теги:
core-data

16 ответов

115

Мне удалось найти файл sqlite и его в этом пути:

Библиотека/Разработчик/CoreSimulator/Devices/(числа и буквы)/данные/Контейнеры/Данные/Приложение/(цифры и буквы)/Documents/

(цифры и буквы) означает папку, которая будет уникальной для вашего приложения/компьютера, но будет выглядеть так: 779AE2245-F8W2-57A9-8C6D-98643B1CF01A

Я смог найти его, зайдя в appDelegate.m, прокрутив вниз до

- (NSURL *)applicationDocumentsDirectory 

и NSLogging пути возврата, например:

// Returns the URL to the application Documents directory.
- (NSURL *)applicationDocumentsDirectory
{
    NSLog(@"%@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory  inDomains:NSUserDomainMask] lastObject]);

    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
 }

Это даст вам ваш уникальный путь, что упростит вам работу, потому что сложно найти его с двумя неназванными папками/строками букв и цифр.

  • 3
    Используйте xcrun simctl list чтобы получить список имен симуляторов и их UUID.
  • 0
    Обратите внимание, что если вы используете общую базу данных для группы приложений (например, когда вы используете расширение), путь будет Библиотека / Разработчик / CoreSimulator / Устройства / $ number / data / Containers / Shared / AppGroup / $ number / Name.sqlite
48

Попробуйте этот простой шаг 3

  • Скопируйте следующий код в didFinishLaunchingWithOptions ваш appdelegate.m и добавьте точку прерывания перед NSLog()

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

Или в Swift:

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

Изображение 1139

2.Открыть Finder- > Go → Перейти в папку и вставить путь, скопированный с шага 1

Изображение 1140

3. Ях!!! Вы находитесь в своем пункте назначения.

  • 0
    Работает нормально спасибо
  • 2
    Для swift3 используйте: NSSearchPathForDirectoriesInDomains (.applicationSupportDirectory, .userDomainMask, true)
35

Если ваше приложение использует Core Data, это всего лишь вопрос поиска файла sqlite в терминале:

find ~ -name app_db_file_name.sqlite

В результате будет указан полный путь к папкам симулятора, содержащим ваше приложение.

  • 2
    @ AlexWei Я бы хотел, чтобы Apple добавила кнопку в меню «Файл» в «Открыть папку документов симулятора в Finder» или что-то подобное. Кажется смешным, что его до сих пор нет, учитывая, что они постоянно меняют место хранения файлов ...
  • 1
    Если другие заинтересовались, я добавил эту команду в качестве псевдонима в свой .profile: alias myapp_simulator_db="find ~/Library/Developer/CoreSimulator/Devices -name MyApp.sqlite" . Это удобно, когда вам нужно повторно запустить эту команду.
Показать ещё 1 комментарий
19

Я взломал этот однострочный (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'" \;

Отпечатки:

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

Update:

Как кто-то указал здесь, также можно запустить xcrun simctl list devices, чтобы получить аналогичный результат:

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

Если вы используете Swift, это вернет абсолютный путь каталога документа:

func applicationDirectoryPath() -> String {
    return NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last! as String
}
  • 1
    Должен быть назван "func documentDirectoryPath ()", что это, где вы собираетесь ...
12

Я написал bash script для поиска местоположения папки вашего приложения и папки данных приложения в симуляторе, вы можете скачать его здесь. После распаковки script вы можете перейти в папку, в которой находится script, и использовать ее. Если вы вызываете его без параметров, он предоставит вам список установленных имитаторов iOS. Затем вы можете использовать параметры, чтобы найти свою программу. Запись:

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

найдет папку приложения и папку домашней области для вашего приложения на симуляторе iPad Air iOS 8. Вот пример:

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

Update

Там обновлено исходное script, которое позволяет выполнять поиск по типу устройства с использованием опции -d. Я также написал еще один script, который создает серию имен с именами, так что вы можете найти свои документы приложений и приложений. Этот script сделает папку с именем iOS_SIMULATORS в вашей домашней области, и вы можете легко перейти к своему приложению оттуда.

  • 0
    Отличный сценарий, очень помог мне, спасибо!
  • 0
    Отлично, я отредактировал твой скрипт, чтобы сделать еще один, который переиницитирует все данные симулятора определенного приложения. Большое спасибо, Джеймс!
Показать ещё 1 комментарий
6

Мне удалось найти папку для симуляторов со следующим выходом консоли:

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

в моем случае это было (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/
5

Основываясь на ответах Майклса, это для Swift 3

    func applicationDirectoryPath() -> String {
        return NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! as String
    }
  • 0
    Единственное решение здесь!
4

Для Swift 3.0

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

вы можете получить местоположение Coredata в Xcode 8.2

  • 0
    Это сработало. :)
2

Для SWIFT 3:

Скопируйте этот код в файл doneFinishLaunchingWithOptions

 print(NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true).last! as String)
  • 0
    Это помогло мне. но когда я пытаюсь перейти по этому пути через терминал, он говорит: такого файла или каталога нет, но когда я пытаюсь перейти в папку, он на самом деле существует.
  • 0
    Это работало для меня на OSX. Мне нужно было зайти еще на 1 каталог в каталог «Поддержка приложений» с именем <имя моего приложения>, чтобы обработать файл .sqlite.
2

Для быстрого 3

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

После новых обновлений Xcode я обнаружил, что файлы sql теперь хранятся в новой папке /Library/Application Support, это может быть уникальной ситуацией, но если вы не нашли файлы sql в папке с папками, здесь:

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

прежде чем он будет сохранен в папке Documents:

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

2

Как Джеймс Снук Я создал свой собственный script, чтобы обеспечить более легкий доступ к приложениям симулятора. Я думаю, что это может быть удобно для многих людей, приезжающих сюда, кроме меня.

В отличие от своего script мой не является инструментом поиска, он создает полную (и удобочитаемую) структуру папок со всеми устройствами/временем выполнения и помещает софт-приложения в приложения.

Вы можете получить в этом Gist.

Запускайте его каждый раз, когда вы устанавливаете приложение в симуляторе, или просто запускаете его каждый раз, когда вы придумываете приложение по любой причине (оно будет обновляться и открывать папку устройств в Finder).

  • 0
    Вы можете адаптировать этот скрипт для автоматизации некоторых вещей. Но я должен сказать, что это приложение с графическим интерфейсом, которое я только что нашел, звучит как действительно полезная альтернатива, если вы просто хотите получить доступ к папкам приложения :)
  • 0
    Это также довольно приятно, но я предпочитаю второй сценарий, опубликованный Джеймсом Снук, так как он создает мягкие ссылки на каталоги данных.
1

Ни один из ответов не упоминал простейший способ фактически получить местоположение файла БД.

Он даже не требует изменения исходного кода, поскольку это простой переключатель времени выполнения в XCode.

  • Выберите "Редактировать схему" рядом с кнопкой "Выполнить".

    Изображение 1141

  • Выберите "Выполнить/Аргументы" и добавьте следующие два параметра:

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

    Изображение 1142

  • Запустите приложение, и вы увидите в журналах:

    Изображение 1143

  • 1
    Это действительно самое простое и лучшее решение. Спасибо!
  • 0
    Для меня журнал не появляется, вы можете мне помочь?
Показать ещё 3 комментария
0

Swift 3.x

Найдите doneFinishLaunchingWithOptions в файле AppDelegate и пропустите этот код там.

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

Для iOS 10.0+ вы можете использовать persistentContainer.persistentStoreCoordinator.persistentStores.first?.url

Я создал функцию Utility, которая копирует файл sqlite в нужное место (работает только для симулятора).

Вы можете использовать его как

import CoreData


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

Если вы уже имеете доступ к sqlite, shm и wal файлам, тогда запустите команды в терминале, чтобы объединить файл WAL в файл sqlite.

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

После запуска указанных команд вы можете увидеть данные в вашем файле sqlite.


Вот определение метода полезности для

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

Для

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню