Xcode 6では、Core Dataを使用しているアプリがありますが、iOS 8 iPhoneシミュレーターのアプリケーションサポートにフォルダーがありません。ファイルとCore Data sqliteデータベースはどこに保存されていますか?
Xcode 6では、Core Dataを使用しているアプリがありますが、iOS 8 iPhoneシミュレーターのアプリケーションサポートにフォルダーがありません。ファイルとCore Data sqliteデータベースはどこに保存されていますか?
回答:
Xcode 6ベータでシミュレータディレクトリが移動されました...
~/Library/Developer/CoreSimulator
ディレクトリをアプリのドキュメントフォルダーに移動するのは少し難しいです。たとえば、
~/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を押すだけで、現在のアプリケーションの永続的なDocumentsディレクトリにファインダーワインダーが開くようにしました。この方法では、XCodeがパスを変更する回数に関係なく、実行時にのみ変更され、実行のたびにsimlinkが即座に更新されます。
これが他の人に役立つことを願っています!
ファインダーを開く>ライブラリ>開発者> CoreSimulator>デバイス
次に、ファインダーからアレンジメントの変更アイコンを選択し、追加日を選択します
アプリを選択>データ>コンテナ>データ>アプリケーション>
アプリを選択> Documents>これはあなたの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と入力して隠しディレクトリを開き、Finderウィンドウでコンソールに表示されているパスをクリックします。)
この場所が再び変更されました。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データベースと連携して機能します。