Xcode 6에는 Core Data를 사용하는 앱이 있지만 iOS 8 iPhone Simulator의 응용 프로그램 지원에는 폴더가 없습니다. 내 파일과 Core Data sqlite 데이터베이스는 어디에 저장됩니까?
Xcode 6에는 Core Data를 사용하는 앱이 있지만 iOS 8 iPhone Simulator의 응용 프로그램 지원에는 폴더가 없습니다. 내 파일과 Core Data sqlite 데이터베이스는 어디에 저장됩니까?
답변:
시뮬레이터 디렉토리는 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
iOS8 + XCode6가 빌드 할 때마다 내 앱의 데이터 GUID를 변경하더라도 작동하는 simlink가 있습니다.
xcrun simctl list
명령을 사용하여 시뮬레이터 이름과 장치 UDID 간의 대응 관계를 확인할 수 있습니다. 또는 더 구체적으로 xcrun simctl list devices
명령.
SimPholders 를 사용 하여 시뮬레이터 파일을 찾는 것이 좋습니다 . 시뮬레이터 앱을 추적하고 해당 폴더와 컨텐츠로 직접 이동할 수있는 메뉴 표시 줄 항목입니다. 그것은 굉장.
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 db에 도착하는 것은 큰 고통이되었습니다. 이 스크립트를 작성하고 XCode 내부의 코드 스 니펫으로 만들었습니다. 내 appDelegate 안에 appDidFinishLaunching 안에 넣습니다.
//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를 업데이트합니다.
나는 이것이 다른 사람들에게 유용하기를 바랍니다!
파인더 열기> 라이브러리> 개발자> CoreSimulator> 장치
그런 다음 파인더에서 배열 변경 아이콘을 클릭하여 추가 된 날짜를 선택하십시오.
앱> 데이터> 컨테이너> 데이터> 애플리케이션>을 선택하십시오.
앱을 선택하십시오.> 문서> 여기에 db 파일이 있습니다.
나의 경우에는:
/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]);
-데이터 폴더의 전체 경로를 인쇄합니다.
빠른:
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 클래스에서 일반적으로 CoreData 저장 파일을 가져와야 할 때 참조 용으로 viewDidLoad 에이 줄을 넣습니다. 도움이 되었기를 바랍니다.
NSLog(@"FILE PATH :%@", NSTemporaryDirectory());
(참고 : 경로로 이동하려면 파인더 메뉴에서 이동을 클릭하고 ~ / Library를 입력하여 숨겨진 디렉토리를 연 다음 파인더 창에서 콘솔에 표시된 경로를 클릭하십시오.)
이 위치는 Swift를 사용하는 경우 다시 한 번 변경되었습니다.이 폴더를 사용하여 폴더의 위치를 찾으십시오 (이것은 Apple이 귀하를 위해 생성하는 AppDelegate.swift 파일에서 복사되므로 컴퓨터에서 작동하지 않으면 검색하십시오) 올바른 구문의 파일은 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"
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는 iOS 시뮬레이터의 SQLite 데이터베이스와 호환됩니다.