如何查看核心数据库中存储的内容?

我正在制作一个依赖Core Data的应用程序。 我能够将数据输入文本字段并存储它。

但我需要知道数据是否存储。

我正在尝试向我的tableView创建一个detailView,但我没有得到任何结果。 现在我想知道的是因为我的代码出错了,或者数据是否正确存储。

如何查看应用程序CoreData数据库中存储的内容?

如果使用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 )。

这是我的解决方案(适用于iOS 9):

我使用automator / bash脚本在sqllitebrowser中打开数据库。 该脚本在模拟器中查找最新安装的应用程序。 说明:

  1. 为SQLite安装DB Browser( http://sqlitebrowser.org/
  2. 在Apple Automator中创建新的工作流程。
  3. 拖动“运行Shell脚本块”并粘贴此代码:
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中。 要刷新数据库,只需单击应用程序图标即可。

存储数据库的文件夹最近已更改,而不是您希望找到它的位置。 以下是我用来解决这个问题的方法:首先将此代码添加到viewDidLoad或applicationDidFinishLaunching:

  #if TARGET_IPHONE_SIMULATOR // where are you? NSLog(@"Documents Directory: %@", [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]); #endif 

从这里得到这个: ios 8模拟器的文档目录在哪里

这将在运行时显示应用程序在控制台中的实际位置。 然后使用SQLiteBrowser检查SQLite DB的内容。

像我的魅力一样工作;)

如前所述,您可以使用sqllite命令行工具。

但是,您也可以设置调试标志,它将在通过核心数据执行时转储所有sql命令。

编辑方案,并在“启动时传递的参数”中添加此方案

-com.apple.CoreData.SQLDebug 1

在Swift 3中,你有NSPersistentContainer ,你可以从那里检索路径,如下所示:

 persistentContainer.persistentStoreCoordinator.persistentStores.first?.url 

(假设您只使用一个持久存储)

斯威夫特4

AppDelegate >> didFinishLaunchingWithOptions函数中添加此行:

 print("Documents Directory: ", FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last ?? "Not Found!") 

你的modelName.sqlite文件将在那里。

您可以使用免费的任何SQLite浏览器工具(如http://sqlitebrowser.org/)打开它。

1)获取模拟器的sql数据库的路径。

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSLog(@"%@", [paths objectAtIndex:0]); 

2)打开Finder。 按Cmd + Shift + G. 粘贴你从第1段得到的东西。例如:

 /Users/USERNAME/Library/Developer/CoreSimulator/Devices/701BAC5F-2A42-49BA-B733-C39D563208D4/data/Containers/Data/Application/DCA9E9C7-5FEF-41EA-9255-6AE9A964053C/Documents 

3)像AppPro一样下载AppStore程序。

4)在名为“ProjectName.sqlite”的文件夹中打开文件。

做得好! 你会看到这样的东西: 在此处输入图像描述

从这里下载SQLite浏览器。

在模拟器中运行您的应用程序。 该应用程序应复制到Mac上的路径,如下所示:

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

一旦找到你的应用程序,你必须深入挖掘才能找到sqlite db(通常在Documents下)。

就macOS Sierra版本10.12.2和XCode 8而言

该文件夹应该在这里:

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

像我一样的新手答案,我花了很多时间搞清楚它。 我遵循的步骤是:

  1. 打开取景器并按下Command(Windows) + Shift + G
  2. 转到文件夹add ~/Library/Developer
  3. 搜索您创建的数据库名称,就像我在SQLite中的my.db
  4. 下载并安装SQLite的DB浏览器。
  5. 单击打开数据库。
  6. 现在从您的finder拖放数据库文件。

抱歉回复晚了

我无法在iphone模拟器文件夹中找到它。 然后我通过在日志中打印文档路径找到了该文件夹。

码:

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

而路径结果是这样的:

///Users//Library/Developer/CoreSimulator/Devices//data/Containers/Data/Application//Documents/coredata.sqlite

只需在viewDidLoad中添加:

 debugPrint(FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)) 

您可以考虑print以进行一些快速调试。 (一个优点是你可以在不离开XCode的情况下进行一些简单的调试。)

例如,对于具有属性“AnimalName”的实体“Animals”,请尝试此操作 –

 var animals: [NSManagedObject]! for var i = 0 ; i < animals.count ; i++ { print(animals[i].valueForKey("AnimalName") as! String) } 

如果您已经访问过sqlite,shm和wal文件,则运行终端中的命令将WAL文件合并到sqlite文件中。

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

运行上述命令后,您可以在sqlite文件中看到数据。


将sqlite文件复制到桌面的实用程序(更改桌面路径并给出绝对路径, ~符号将无效。

对于iOS 10.0+您可以使用persistentContainer.persistentStoreCoordinator.persistentStores.first?.url

我创建了Utility函数,将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") } 

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