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

时间:2012-04-20 02:56:08

标签: ios core-data

我正在开发一款依赖Core Data的应用。我可以将数据输入文本字段并存储它。

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

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

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

19 个答案:

答案 0 :(得分:32)

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

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

  1. 为SQLite安装数据库浏览器(http://sqlitebrowser.org/
  2. 在Apple Automator中创建新的工作流程。
  3. 拖动“运行Shell脚本块”并粘贴此代码:
  4. 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
    

    enter image description here

    1. (可选)将此工作流转换为应用程序,保存并将其拖到停靠栏中。要刷新数据库,只需单击应用程序图标。

答案 1 :(得分:24)

如果您使用sqlite作为Core Data的存储介质,您可以在模拟器中运行您的应用程序并尝试检查位于沙箱的Library文件夹中的数据库文件。

路径应类似于:〜/ 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)的免费工具。

答案 2 :(得分:12)

Swift 4

AppDelegate>>中添加此行didFinishLaunchingWithOptions功能:

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

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

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

答案 3 :(得分:10)

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

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

从这里得到这个:where is the documents directory for the ios 8 simulator

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

对我来说像是一种魅力;)

答案 4 :(得分:7)

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

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

编辑方案,并将其添加到“启动时传递的参数”

-com.apple.CoreData.SQLDebug 1

答案 5 :(得分:6)

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)在AppStore程序中下载SQLPro

4)在名称为" ProjectName.sqlite"。

的文件夹中打开文件

好工作!你会看到这样的事情: enter image description here

答案 6 :(得分:6)

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

persistentContainer.persistentStoreCoordinator.persistentStores.first?.url

(假设您只使用一个持久性商店)

答案 7 :(得分:4)

就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

答案 8 :(得分:3)

here下载SQLite浏览器。

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

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

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

答案 9 :(得分:3)

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

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

答案 10 :(得分:2)

对于迟到的回答感到抱歉

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

代码:

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

答案 11 :(得分:2)

其他解决方案已经过时,或者无法轻松或快速地将您定向到SQLite文件,因此我使用FileManager.SearchPathDirectory.applicationSupportDirectory提出了自己的解决方案,该解决方案可以获取sqlite文件所在的确切路径。

func whereIsMySQLite() {
    let path = FileManager
        .default
        .urls(for: .applicationSupportDirectory, in: .userDomainMask)
        .last?
        .absoluteString
        .replacingOccurrences(of: "file://", with: "")
        .removingPercentEncoding

    print(path ?? "Not found")
}

whereIsMySQLite()将在您的Mac上打印粘贴的路径,只需将其粘贴:

  

查找器>转到>转到文件夹

答案 12 :(得分:2)

使用诸如 Core Data Lab 之类的工具,可以轻松便捷地找到Core Data数据库以及查看和分析内容。

此处有更多信息:https://betamagic.nl/products/coredatalab.html

免责声明:我是该工具的创建者。

答案 13 :(得分:1)

只需添加viewDidLoad:

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

答案 14 :(得分:1)

由于没有人指出,如何从物理设备获取sqlite DB。

以下是获取应用程序数据的方法:

Browse the files created on a device by the iOS application I'm developing, on workstation?

打开.xcappdata文件(右键单击>显示包内容)后,通常可以在AppData / Library / Application Support文件夹中找到该数据库文件。

答案 15 :(得分:1)

很惊讶没有人提到这一点,但假设您的 Core Data 存储是 sqlite,您可以通过在终端中执行此操作,在没有第三方工具的情况下快速且脏地转储其内容:

$ sqlite3 <path-to-file.sqlite>

// Dump everything
sqlite> .dump

// Dump just one type
sqlite> .dump ZSOMETYPE

// ^D to exit

答案 16 :(得分:0)

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

请在 AppDelegate 的 applicationDidFinishLaunching 中添加这一行。 它将为我们提供 Documents 的路径。 但是核心数据的数据库在 ./Library/Application Support/ 中,名称为 projectname.sqlite

答案 17 :(得分:0)

我发现查找和打开.sqlite数据库的最佳方法是使用以下脚本:

lsof -Fn -p $(pgrep YOUR_APP_NAME_HERE) | grep .sqlite$ | head -n1

无论出于何种原因,Mac上的输出总是有一个额外的n字符,因此我不得不将其复制并粘贴到open命令中。如果找到正确的命令,请随意修改上面的命令。

对于最好的SQLite浏览器,我建议使用TablePlus。

采用自: https://lukaszlawicki.pl/how-to-quickly-open-sqlite-database-on-ios-simulator/

答案 18 :(得分:0)

如果您已经访问过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)

以下是

的效用方法的定义
/**
 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");
}