66

Core Data に依存するアプリを作成しています。テキストフィールドにデータを入力して保存できます。

しかし、データが保存されているかどうかを知る必要があります。

tableView に detailView を作成しようとしていますが、結果が得られません。今、私は自分のコードで何か間違ったことをしているのか、それともデータが適切に保存されていないのか疑問に思っています。

アプリの CoreData データベースに格納されているものを確認するにはどうすればよいですか?

4

20 に答える 20

45

これが私の解決策です(iOS 9で動作します):

sqllitebrowser でデータベースを開く automator/bash スクリプトを使用します。スクリプトは、シミュレーターにインストールされている最新のアプリを見つけます。指示:

  1. SQLite 用の DB Browser をインストールします ( http://sqlitebrowser.org/ ) 。
  2. Apple Automator で新しいワークフローを作成します。
  3. 「Run Shell script block」をドラッグして、次のコードを貼り付けます。
cd ~/Library/Developer/CoreSimulator/Devices/
cd `ls -t | head -n 1`/data/Containers/Data/Application 
cd `ls -t | head -n 1`/Documents
open -a DB\ Browser\ for\ SQLite ./YOUR_DATABASE_NAME.sqlite

ここに画像の説明を入力

  1. (オプション) このワークフローをアプリケーションに変換し、保存して Dock にドラッグします。データベースを更新するには、アプリのアイコンをクリックするだけです。
于 2016-05-18T12:50:57.700 に答える
38

sqliteのストレージメディアとして使用する場合はCore Data、シミュレーターでアプリを実行し、サンドボックスのライブラリフォルダーにあるデータベースファイルを確認してみてください。

パスは次のようになります。~/Library/Application Support/iPhone Simulator/5.1/Applications/3BF8A4B3-4959-4D8F-AC12-DB8EF4C3B6E1/Library/YourAppName.sqlite

ファイルを開くにはsqlite、ツールが必要です。私はLiya( http://itunes.apple.com/us/app/liya/id455484422?mt=12 )と呼ばれる無料のツールを使用しています。

于 2012-04-20T03:19:44.743 に答える
10

macOS Sierra バージョン 10.12.2 および Xcode 8 に関する限り

フォルダは次の場所にあります。

/Users/$username$/Library/Developer/CoreSimulator/Devices/$DeviceID$/data/Containers/Data/Application/$ApplicationID$/Library/Application Support/xyz.sqlite

デバイス ID を取得するには、ターミナルを開いて貼り付けます。

instruments -s devices
于 2017-01-25T11:44:41.863 に答える
9

Swift 3 では、 があり、NSPersistentContainerそこから次のようにパスを取得できます。

persistentContainer.persistentStoreCoordinator.persistentStores.first?.url

(1 つの永続ストアのみを使用していると仮定します)

于 2016-11-30T12:12:17.697 に答える
9

前に述べたように、sqllite コマンド ライン ツールを使用できます。

ただし、コア データを介して実行されるすべての sql コマンドをダンプするデバッグ フラグを設定することもできます。

スキームを編集し、これを「起動時に渡される引数」に追加します

-com.apple.CoreData.SQLDebug 1

于 2012-04-20T04:17:41.920 に答える
3

ここから SQLite ブラウザをダウンロードします。

シミュレーターでアプリを実行します。アプリは、次のような Mac 上のパスにコピーする必要があります。

/Users/$your username$/Library/Application Support/iPhone Simulator/$your iphone simulator version$/Applications/

アプリを見つけたら、さらに深く掘り下げて sqlite データベースを見つける必要があります (通常は [ドキュメント] の下にあります)。

于 2012-04-20T03:22:17.507 に答える
3

私は初心者のための答えでしたが、私はそれを理解するのにかなりの時間を費やしました. 私が従った手順は次のとおりです。

  1. ファインダーを開き、 を押しCommand(Windows) + Shift + Gます。
  2. フォルダー追加に移動します~/Library/Developer
  3. 私の場合はmy.dbSQLiteにあったので、作成したDB名を検索します。
  4. SQLite 用の DB ブラウザーをダウンロードしてインストールします。
  5. [データベースを開く] をクリックします。
  6. ファインダーからDBファイルをドラッグアンドドロップします。
于 2017-09-16T05:52:15.340 に答える
2

iPhone Simulator フォルダーで見つけることができませんでした。次に、ドキュメントのパスをログに出力してフォルダーを見つけました。

NSLog(@"The Path is %@", 
  [[[NSFileManager defaultManager] URLsForDirectory:
     NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);

パスは次のようになります。

// /Users/<username>/Library/Developer/CoreSimulator/Devices/<app specific id>/data/Containers/Data/Application/<id>/Documents/coredata.sqlite
于 2016-03-31T08:00:58.817 に答える
1

既に sqlite、shm、および wal ファイルにアクセスしている場合は、ターミナルでコマンドを実行して、WAL ファイルを sqlite ファイルにマージします。

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

上記のコマンドを実行すると、sqlite ファイルにデータが表示されます。


sqlite ファイルをデスクトップにコピーするユーティリティ (デスクトップ パスを変更して絶対パスを指定すると、~シンボルは機能しません。

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)

のユーティリティメソッドの定義です

/**
 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");
}
于 2017-04-14T06:41:08.293 に答える
0

Mac OS ターミナルを開き、次のコマンドを入力します。

xcrun simctl get_app_container booted com.ondevtratech.PlannerCoreData


xcrun simctl get_app_container booted <bundle <>identifier> 

DB を開くには:

brew install --cask db-browser-for-sqlite

<< アプリのパス: sql lite.app >> <<.sqlite DB のパス>> を開く

例: open -a /Applications/DB\ Browser\ for\ SQLite.app /DTMPlanner.sqlite

于 2022-02-01T06:02:43.900 に答える