提问



我正在制作一个依赖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).[26]

其它参考1


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


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



  1. 为SQLite安装数据库浏览器(http://sqlitebrowser.org/)<< li>
  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



[27] [28]



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


其它参考2


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


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


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


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


像我的魅力一样工作;)

其它参考3


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


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


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


-com.apple.CoreData.SQLDebug 1

其它参考4


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


persistentContainer.persistentStoreCoordinator.persistentStores.first?.url


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

其它参考5


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程序。 [31]


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


做得好!你会看到这样的东西:
[32]

其它参考6


Swift 4


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


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


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


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

其它参考7


从这里下载SQLite浏览器。[34]


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


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


一旦找到你的应用程序,你必须深入挖掘找到sqlite数据库(它通常在文档下)。

其它参考8


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



  1. 打开取景器并按Command(Windows) + Shift + G

  2. 转到文件夹add ~/Library/Developer

  3. 搜索您创建的数据库名称,就像我在SQLite中的my.db一样。

  4. 下载并安装SQLite的数据库浏览器。

  5. 点击打开数据库。

  6. 现在从您的取景器中拖放数据库文件。


其它参考9


就macOS Sierra版本10.12.2和XCode 8而言


该文件夹应该在这里:


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

其它参考10


抱歉回复晚了


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


码:


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


而路径结果是这样的:


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

其它参考11


只需在viewDidLoad中添加:


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

其它参考12


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


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


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

其它参考13


如果您已经访问过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实用方法的定义/questions/tagged/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 /questions/tagged/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");
}