Core Data に依存するアプリを作成しています。テキストフィールドにデータを入力して保存できます。
しかし、データが保存されているかどうかを知る必要があります。
tableView に detailView を作成しようとしていますが、結果が得られません。今、私は自分のコードで何か間違ったことをしているのか、それともデータが適切に保存されていないのか疑問に思っています。
アプリの CoreData データベースに格納されているものを確認するにはどうすればよいですか?
これが私の解決策です(iOS 9で動作します):
sqllitebrowser でデータベースを開く automator/bash スクリプトを使用します。スクリプトは、シミュレーターにインストールされている最新のアプリを見つけます。指示:
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
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 )と呼ばれる無料のツールを使用しています。
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
Swift 3 では、 があり、NSPersistentContainer
そこから次のようにパスを取得できます。
persistentContainer.persistentStoreCoordinator.persistentStores.first?.url
(1 つの永続ストアのみを使用していると仮定します)
前に述べたように、sqllite コマンド ライン ツールを使用できます。
ただし、コア データを介して実行されるすべての sql コマンドをダンプするデバッグ フラグを設定することもできます。
スキームを編集し、これを「起動時に渡される引数」に追加します
-com.apple.CoreData.SQLDebug 1
ここから SQLite ブラウザをダウンロードします。
シミュレーターでアプリを実行します。アプリは、次のような Mac 上のパスにコピーする必要があります。
/Users/$your username$/Library/Application Support/iPhone Simulator/$your iphone simulator version$/Applications/
アプリを見つけたら、さらに深く掘り下げて sqlite データベースを見つける必要があります (通常は [ドキュメント] の下にあります)。
私は初心者のための答えでしたが、私はそれを理解するのにかなりの時間を費やしました. 私が従った手順は次のとおりです。
Command(Windows) + Shift + G
ます。~/Library/Developer
my.db
SQLiteにあったので、作成したDB名を検索します。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
既に sqlite、shm、および wal ファイルにアクセスしている場合は、ターミナルでコマンドを実行して、WAL ファイルを sqlite ファイルにマージします。
$ sqlite3 persistentStore
sqlite> PRAGMA wal_checkpoint;
Press control + d
上記のコマンドを実行すると、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)
これがswiftのユーティリティメソッドの定義です
/**
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")
}
目的 c の場合
/**
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");
}
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