我正在开发一款依赖Core Data的应用。我可以将数据输入文本字段并存储它。
但我需要知道数据是否存储。
我正在尝试向我的tableView创建一个detailView,但我没有得到任何结果。现在我想知道的是因为我的代码出了问题,或者数据是否正确存储。
如何查看应用的CoreData数据库中存储的内容?
答案 0 :(得分:32)
这是我的解决方案(适用于iOS 9):
我使用automator / bash脚本在sqllitebrowser中打开数据库。该脚本在模拟器中查找最新安装的应用程序。 说明:
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 :(得分: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"。
的文件夹中打开文件答案 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)
像我一样回答新手,我花了很多时间搞清楚。 我遵循的步骤是:
Command(Windows) + Shift + G
。~/Library/Developer
my.db
一样。答案 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文件中看到数据。
~
符号无法正常工作。对于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")
}
/**
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");
}