В Xcode 6 у меня есть приложение, в котором я использую Core Data, но в Application Support для iOS 8 iPhone Simulator нет папки. Где хранятся мои файлы и база данных sqlite Core Data?
В Xcode 6 у меня есть приложение, в котором я использую Core Data, но в Application Support для iOS 8 iPhone Simulator нет папки. Где хранятся мои файлы и база данных sqlite Core Data?
Ответы:
Каталог симулятора был перемещен с бета-версией Xcode 6 в ...
~/Library/Developer/CoreSimulator
Просмотр каталога в папке Documents вашего приложения немного сложнее, например,
~/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
Теперь у меня есть simlink, который работает, хотя iOS8 + XCode6 меняет GUID данных моего приложения каждый раз, когда я создаю.
xcrun simctl list
Команда может быть использована , чтобы увидеть соответствие между именами тренажеров и UDIDs устройств. Или, точнее, xcrun simctl list devices
команду.
Я бы посоветовал вам использовать SimPholder для поиска файлов симулятора. Это элемент строки меню, который отслеживает ваши приложения-симуляторы и позволяет вам переходить непосредственно к их папкам и содержимому. Это круто.
Я нашел приложение SimulatorManager очень полезным. Вы попадете прямо в папку приложений установленных симуляторов. Я пробовал с симуляторами 7.1, 8.0 и 8.1.
SimulatorManager отображается в виде значка на панели задач и предоставляет возможность «Запускать при входе в систему».
Примечание . Это работает только с Xcode 6 (в моем случае - 6.1.1) и выше.
Надеюсь, это поможет!
Чтобы узнать, где ваш файл .sqlite хранится в вашем AppDelegate.m, добавьте следующий код
- (NSURL *)applicationDocumentsDirectory
{
NSLog(@"%@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
теперь вызовите этот метод в AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//call here
[self applicationDocumentsDirectory];
}
Некоторое время я боролся с этим. Просто добраться до моей локальной базы данных sqlite стало огромной болью. Я написал этот скрипт и сделал его фрагментом кода внутри XCode. Я помещаю его в свой appDidFinishLaunching внутри моего 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
Это создает simlink в корне вашего диска. (Возможно, вам придется создать эту папку самостоятельно в первый раз и выполнить ее chmod, или вы можете изменить местоположение на другое место) Затем я установил плагин xcodeway https://github.com/onmyway133/XcodeWay
Я немного изменил его, чтобы я мог просто нажать cmd + d и открыть средство поиска в постоянном каталоге документов моего текущего приложения. Таким образом, независимо от того, сколько раз XCode изменяет ваш путь, он изменяется только при запуске и обновляет вашу simlink сразу при каждом запуске.
Надеюсь, это будет полезно для других!
Откройте Finder> Библиотека> Разработчик> CoreSimulator> Устройства
Затем значок «Изменить расположение» в искателе выберите «Дата добавления».
Выберите свое приложение> данные> контейнер> данные> приложения>
выберите свое приложение> Документы> Вот ваш файл БД
В моем случае:
/Users/pluto/Library/Developer/CoreSimulator/Devices/A75107D2-A535-415A-865D-978B2555370B/data/Containers/Data/Application/265A12BC-FF5B-4235-B5EF-6022B83754B4/Documents/dboPhotoBucket.sqlite
В противном случае сделайте это:
NSLog(@"app dir: %@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);
- Будет напечатан полный путь к папке с данными.
Swift:
let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
println("App Path: \(dirPaths)")
let dirPaths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) print("App Path: \(dirPaths)")
Используйте Finder -> перейдите в папку и введите указанный базовый путь для доступа к папкам приложений.
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSLog(@"%@",basePath);
Симулятор помещает файл в ~ / Library / Developer / CoreSimulator / Devices / ... но путь после / Devices у всех разный.
Воспользуйтесь этим удобным методом. Он возвращает путь к временному каталогу для текущего пользователя и не принимает аргументов.
NSString * NSTemporaryDirectory ( void );
Поэтому в моем классе ViewController я обычно помещаю эту строку в свой viewDidLoad только для справки, когда мне нужно получить файл, хранящийся в CoreData. Надеюсь это поможет.
NSLog(@"FILE PATH :%@", NSTemporaryDirectory());
(Примечание: чтобы перейти к пути, в меню поиска нажмите «Перейти» и введите ~ / Library, чтобы открыть скрытый каталог, затем в окне Finder вы можете щелкнуть путь, указанный на консоли.)
Это местоположение снова было изменено, если вы используете Swift, используйте его, чтобы узнать, где находится папка (он скопирован из файла AppDelegate.swift, который Apple создает для вас, поэтому, если он не работает на вашем компьютере, выполните поиск в этот файл для правильного синтаксиса, это работает на моем с использованием симулятора Xcode 6.1 и iOS 8):
let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
println("Possible sqlite file: \(urls)")
Тренажеры расположены под:
~/Library/Developer/CoreSimulator/
Здесь они перечислены как каталоги с именами UUID. Используйте сортировку по дате изменения, чтобы найти самую последнюю. Внутри перейдите к:
/data/Containers/Data/Application/
Здесь вы получите список всех приложений на этом устройстве. Вы можете снова отсортировать это, чтобы получить последнюю версию приложения.
ПРИМЕЧАНИЕ. Xcode изменяет имя каталога каждый раз, когда вы запускаете приложение, поэтому не полагайтесь на создание псевдонимов / ярлыков на рабочем столе.
Самый простой способ - использовать здесь приложение , которое делает все автоматически.
Я создал этот скрипт, который заархивирует последнее приложение, созданное для любого симулятора, и закрепит его на рабочем столе.
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"
В Swift 4 или Swift 5 можно использовать NSHomeDirectory()
.
Самый простой способ в Xcode 10 (или Xcode 11) - приостановить ваше приложение (например, когда оно достигает точки останова) и запустить эту строку в консоли отладчика:
po NSHomeDirectory()
po
обозначает объект печати и печатает большинство вещей
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
В Swift 4 вы можете использовать приведенный ниже код, чтобы получить домашний каталог вашего приложения. Каталог документов вашего приложения находится там.
print(NSHomeDirectory())
Я думаю, вы уже знаете, что домашний каталог вашего приложения можно изменить, поэтому, если вы не хотите добавлять дополнительный код в свою кодовую базу, SimPholder - отличный инструмент для вас.
Более того, вы можете задаться вопросом, есть ли инструмент, который поможет вам сэкономить время на закрытии и повторном открытии той же базы данных SQLite каждый раз после изменения домашнего каталога вашего приложения. И ответ - да, я знаю инструмент SQLiteFlow . В этом документе говорится, что:
Обрабатывать имя файла базы данных или изменения каталога. Благодаря этому SQLiteFlow может работать с вашей базой данных SQLite в симуляторе iOS.
Вот sh для последнего использованного симулятора и приложения. Просто запустите sh, скопируйте напечатанный текст, вставьте и запустите команду для показа в Finder.
#!/bin/zsh
lastUsedSimulatorAndApplication=`ls -td -- ~/Library/Developer/CoreSimulator/Devices/*/data/Containers/Data/Application/*/ | head -n1`
echo $lastUsedSimulatorAndApplication