Sqliteファイルの場所のコアデータ


91

通常、コアデータアプリのsqliteストアファイルは次の場所にあります

ライブラリ>アプリケーションサポート> iPhoneシミュレータ> 7.1(または使用しているバージョン)>アプリケーション>(フォルダにアプリが含まれているフォルダ)>ドキュメント

フォルダーですが、IOS 8では見つかりません。iPhoneシミュレーターフォルダー内に8.0フォルダーを追加するだけだと思いますが、そこにはありません。誰かがそれを見つけることができましたか?


2
私はあなたの質問がされる前に1週間以上尋ねたので、あなたの質問が重複していると確信しています。私がこれまでに尋ねた最初の質問であることを考慮して、この質問のクレジットを取得していただければ幸いです。あなたはすでに@HenryGlendeningの評判を持っているようです
19:15に

DBPATHチェックするために、この方法をチェックしてください stackoverflow.com/a/27358291/3840428
Nagarjun


2
実際のデバイスからCoreDataファイルを取得する方法を誰かが知っていますか?以前のバージョンのXcodeではiTunesを使用してこれを行っていましたが、Xcode 8 / iOS10以降、CoreDataファイルはアプリのドキュメントディレクトリに格納されていないため、iTunesには表示されません。コンピューターのデバイスからCoreDateファイルを取得する方法はありますか?
Bocaxica

1
彼らがなぜこれを動かし続けるのか私にはわかりません。彼らはどこかにそれを置いて、そのままにしておくべきです。
RegularExpression

回答:


135

私はなんとかsqliteファイルを見つけることができました、そしてそれは今このパスにあります:

ライブラリ/ Developer / CoreSimulator / Devices /(数字と文字)/ data / Containers / Data / Application /(数字と文字)/ドキュメント/

(数字と文字)は、アプリ/コンピューターに固有のフォルダーを表しますが、次のようになります:779AE2245-F8W2-57A9-8C6D-98643B1CF01A

appDelegate.mに移動し、下にスクロールしてそれを見つけることができました

- (NSURL *)applicationDocumentsDirectory 

メソッドと、次のような戻りパスのNSLogging:

// 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];
 }

これはあなたにあなたのユニークなパスを与え、あなたのためにそれをより簡単にします、それは2つの名前のないフォルダ/文字と数字の文字列でそれを見つけるのが難しいからです。

Swift 4.2:

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

4
xcrun simctl listシミュレータ名とそのUUIDのリストを取得するために使用します。
Sandy Chapman、

1
アプリグループに共有データベースを使用している場合(拡張機能を使用している場合など)、パスはLibrary / Developer / CoreSimulator / Devices / $ number / data / Containers / Shared / AppGroup / $ number / Name.sqliteであることに注意してください
andreacipriani

7
2019年Library/Developer/CoreSimulator/Devices/(numbers and letters)/data/Containers/Data/Application/(numbers and letters)/Documents/は、もう当てはまらないことに注意してください。これで、.sqliteおよび関連する2つのファイルが見つかりますLibrary/Developer/CoreSimulator/Devices/(numbers and letters)/data/Containers/Data/Application/(numbers and letters)/Library/Application Support/
Gang Fang

@GangFang Xcode 7でビルドされたObjective Cコードを最新の迅速なバージョンに変換して新しいプロジェクトを作成しようとしています。この2つの異なる.sqliteファイルを一度に移行する方法を教えてください。
Sanjay Shah

85

DBファイルの場所を実際に取得する最も簡単な方法については、どの回答も言及していません。

これは、XCodeの単純なランタイムスイッチであるため、ソースコードを変更する必要さえありません。

  1. 「実行」ボタンの横にある「スキームの編集...」を選択します。

    スキームを編集

  2. 「実行/引数」を選択し、次の2つのオプションを追加します。

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

    オプション

  3. アプリを実行すると、ログに表示されます。

    ログ


2
これは確かに最もシンプルで最良のソリューションです。ありがとう!
Omid Ariyan

ログが表示されない私にとって、あなたは私を助けることができますか?
アウグスト、

@Augusto私はここではあなたを助けることはできませんが、それについて新しい質問をする場合、人々はおそらくそれに答えてあなたを助けることができます。
ハイパーノット2018年

正解です。これは受け入れられる答えになるはずです。また、Xcodeの設定以外に、コンソールでこの出力の色を変更する方法はありますか?それはもう少し際立っていた場合、それはいいだろう
Coreyd303

ヒントありがとうございます!パスは常に変化します。今のところ(iOS 13.3.1)パスは/ Users / *** / Library / Developer / CoreSimulator / Devices / A91CEB1C-B15D-46B5-9B83-DB22056DEFD1 / data / Containers / Shared / AppGroup / B835599A- CA36-432F-871A-17EDA181CC54 /したがって、自分で推測するのではなく、CoreDataデバッグ情報から取得することをお勧めします。
AlKir

52

このシンプルな3ステップをお試しください

  1. 次のコードをコピーして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])

ここに画像の説明を入力してください

2.Finderを開く->移動->フォルダに移動し、手順1からコピーしたパスを貼り付けます

ここに画像の説明を入力してください

3.うん!!! あなたはあなたの目的地にいます。


2
swift3の場合:NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory、.userDomainMask、true)
Yohst

38

アプリがCore Dataを使用している場合は、ターミナルでsqliteファイルを検索するだけです。

find ~ -name app_db_file_name.sqlite

結果には、アプリを含むシミュレーターフォルダーへの完全パスが一覧表示されます。


2
@AlexWei Appleが[ファイル]メニューに[ファインダー内のシミュレーターのドキュメントフォルダーを表示する]などのボタンを追加してほしい。彼らがファイルを保存している場所を変更し続けることを考えると、それがまだそこにないのはばかげているようです...
DiscDev

1
他の人が興味を持っている場合に備えて、このコマンドを.profileのエイリアスとして追加しましたalias myapp_simulator_db="find ~/Library/Developer/CoreSimulator/Devices -name MyApp.sqlite"。このコマンドを繰り返し実行する必要がある場合に便利です。
乾杯

sudo find〜
Qadir Hussain

21

私はこのワンライナー(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

更新:

誰かがここで指摘しように、実行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)

18

Swiftを使用している場合は、ドキュメントディレクトリの絶対パスが返されます。

func applicationDirectoryPath() -> String {
    return NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last! as String
}

1
あなたが...行く場所と命名されなければならない「documentDirectoryPath funcを()」何それがある
Yohst

13

シミュレーター内でアプリケーションフォルダーとアプリケーションデータフォルダーの場所を見つけるためのbashスクリプトを作成しましたここからダウンロードできます。スクリプトを解凍すると、スクリプトが含まれているフォルダーに移動して使用できます。オプションなしで呼び出すと、インストールされている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

更新

-dオプションを使用してデバイスタイプに基づいて検索できるようにする元のスクリプトへの更新があります。また、アプリケーションとアプリケーションドキュメントを見つけられるように、一連のわかりやすい名前のフォルダーを作成する別のスクリプトも作成しました。このスクリプトにより、ホームエリアにiOS_SIMULATORSというフォルダーが作成され、そこから簡単にアプリケーションに移動できます。


完璧です。スクリプトを編集して、特定のアプリのすべてのシミュレータデータを再初期化するスクリプトを作成しました。ジェームス、どうもありがとう!
マーティン

ありがとう!一般的なPITAに対する優れたソリューション。
デビッドハーシー2016年

6

次のコンソール出力でシミュレーターフォルダーを見つけることができました。

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

私の場合は(Xcode 6ベータ)でした

app dir: file:///Users/user/Library/Developer/CoreSimulator/Devices/D00C56D4-DDA3-47B0-9951-27D3B9EC68E8/data/Applications/6ABF3E54-37F5-4AD1-A223-F7467F601FB6/Documents/

6

マイケルズの回答に基づくと、これはSwift 3用です

    func applicationDirectoryPath() -> String {
        return NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last! as String
    }

ここでの唯一の解決策!
Fattie

5

Swift 3.0の場合

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

Xcode 8.2でCoredataの場所を取得できます


5

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/


4

SWIFT 3の場合:

このコードをコピーしてdidFinishLaunchingWithOptionsに貼り付けます

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

これは私を助けました。しかし、ターミナルを介してそのパスに移動しようとすると、そのようなファイルやディレクトリはありませんが、フォルダオプションに移動しようとすると、実際に存在します。
カディールフセイン

これはOSXでは私にとってはうまくいきました。.sqliteファイルを調整するために、<アプリケーション名>という名前の「アプリケーションサポート」ディレクトリ内にあるもう1つのディレクトリに移動する必要がありました。
Jacksonsox 2017年


2

同じようにジェームズ・スヌーク私は、シミュレータのアプリに簡単にアクセスを提供するために、自分自身のスクリプトを作成しました。私以外の多くの人に便利だと思います。

彼のスクリプトとは異なり、私のものは検索ツールではなく、すべてのデバイス/ランタイムで完全な(そして人間が読める)フォルダー構造を作成し、アプリへのソフトリンクを配置します。

このGistで取得できます。

シミュレーターにアプリをインストールするたびに実行するか、何らかの理由でアプリをフェッチするたびに実行します(更新され、Finderでデバイスフォルダーが開きます)。


このスクリプトを調整して、いくつかのことを自動化できます。しかし、私が見つけたこのGUIアプリは、アプリフォルダーにアクセスしたいだけの場合、本当に便利な代替手段として聞こえると言わざるを得ません:)
fbeeper

これも非常に便利ですが、データディレクトリへのソフトリンクも作成するため、James Snookが投稿した2番目のスクリプトの方が好きです。
David Hersey

2

ディレクトリを指定していない場合は、以下のコードを使用してデフォルトのディレクトリを印刷できます。

print(NSPersistentContainer.defaultDirectoryURL())


1

以下のためにiOS 10.0+あなたが使用することができます persistentContainer.persistentStoreCoordinator.persistentStores.first?.url

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

0

Swift 3.x

AppDelegateファイルでdidFinishLaunchingWithOptions関数を見つけ、このコードをそこに貼り付けます。

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

0

Swift 4.x

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

0

Swift 4.2

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

-1

次のコードを使用できます。

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

コアデータの永続ストレージの場所、つまりsqliteを出力します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.