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

2020/12/02 17:32 · ios ·  · 0评论

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

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

我正在尝试对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):

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

  1. 为SQLite安装数据库浏览器(http://sqlitebrowser.org/
  2. 在Apple Automator中创建新的工作流程。
  3. 拖动“ Run 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. (可选)将此工作流程转换为应用程序,将其保存并将其拖到您的扩展坞中。要刷新数据库,只需单击应用程序图标。

斯威夫特4,5

AppDelegate>>didFinishLaunchingWithOptions函数中添加以下行

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

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

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

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

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

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

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

对我来说就像一个魅力;)

其他解决方案已经过时,或者无法轻松或快速地将您定向到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上的路径:

Finder>转到>转到文件夹

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

但是,您还可以设置调试标志,该调试标志将在通过核心数据执行的所有sql命令中转储出去。

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

-com.apple.CoreData.SQLDebug 1

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

persistentContainer.persistentStoreCoordinator.persistentStores.first?.url

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

就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

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

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

2)打开查找器。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”的文件夹中打开文件。

做得好!您将看到如下内容:
在此处输入图片说明

此处下载SQLite浏览器

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

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

找到应用程序后,您必须更深入地查找sql​​ite数据库(通常在“文档”下)。

就像我对菜鸟的回答一样,我花了很多时间弄清楚它。我遵循的步骤是:

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

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

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

在工作站上浏览我正在开发的iOS应用程序在设备上创建的文件?

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

抱歉回复晚了

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

码:

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

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

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

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

如果您已经可以访问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");
}

只需添加viewDidLoad:

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

我发现查找和打开.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/

本文地址:http://ios.askforanswer.com/ruhejianchahexinshujushujukuzhongcunchudeneirong.html
文章标签: ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!