Как я могу проверить, что хранится в моей базовой базе данных?
Я делаю приложение, которое опирается на Core Data. Я могу ввести данные в текстовое поле и сохранить его.
Но мне нужно знать, хранятся ли данные.
Я пытаюсь сделать detailView для моего tableView, и я не получаю никаких результатов. Теперь мне интересно, потому что я делаю что-то не так с моим кодом или данные хранятся правильно.
Как посмотреть, что хранится в базе данных приложения CoreData?
Ответы
Ответ 1
Если вы используете 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).
Ответ 2
Вот мое решение (работает на iOS 9):
Я использую автомат /bash script, который открывает базу данных в sqllitebrowser. script находит последнее установленное приложение в симуляторе.
Инструкция:
- Установите DB Browser для SQLite (http://sqlitebrowser.org/)
- Создайте новый рабочий процесс в Apple Automator.
- Перетащите "Запустить оболочку script block" и вставьте этот код:
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
![введите описание изображения здесь]()
- (Необязательно) Преобразуйте этот рабочий процесс в приложение, сохраните его и перетащите в свою док-станцию. Чтобы обновить базу данных, просто нажмите значок приложения.
Ответ 3
Свифт 4, 5
Добавьте эту строку в AppDelegate
>> didFinishLaunchingWithOptions
:
print("Documents Directory: ", FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last ?? "Not Found!")
Ваш файл modelName.sqlite
будет там.
Вы можете открыть его с помощью любых инструментов браузера SQLite, таких как http://sqlitebrowser.org/, которые бесплатны.
Ответ 4
Папка, в которой хранится db, недавно была изменена и не там, где вы ожидаете ее найти. Вот что я использовал для решения этой проблемы:
Сначала добавьте этот код в свой viewDidLoad или applicationDidFinishLaunching:
#if TARGET_IPHONE_SIMULATOR
// where are you?
NSLog(@"Documents Directory: %@", [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);
#endif
Получите это отсюда: где находится каталог документов для симулятора ios 8
Это покажет фактическое местоположение вашего приложения в консоли во время выполнения.
Затем используйте SQLiteBrowser, чтобы проверить содержимое вашей базы данных SQLite.
Работала как шарм для меня;)
Ответ 5
Как уже говорилось, вы можете использовать инструмент командной строки sqllite.
Однако вы также можете установить флаг отладки, который будет выгружать все команды sql по мере их выполнения с помощью данных ядра.
Измените схему и добавьте ее в "Аргументы, переданные при запуске"
-com.apple.CoreData.SQLDebug 1
Ответ 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]()
Ответ 7
В Swift 3 у вас есть NSPersistentContainer
, и вы можете найти путь оттуда следующим образом:
persistentContainer.persistentStoreCoordinator.persistentStores.first?.url
(Предполагая, что вы используете только одно постоянное хранилище)
Ответ 8
Что касается macOS Sierra версии 10.12.2 и XCode 8
Папка должна быть здесь:
/Users/$username$/Library/Developer/CoreSimulator/Devices/$DeviceID$/data/Containers/Data/Application/$ApplicationID$/Library/Application Support/xyz.sqlite
Чтобы получить идентификатор устройства - Откройте терминал и вставьте:
instruments -s devices
Ответ 9
Загрузите браузер SQLite из здесь.
Запустите приложение в Симуляторе. Приложение должно быть скопировано на путь на вашем Mac, который выглядит следующим образом:
/Users/$your username$/Library/Application Support/iPhone Simulator/$your iphone simulator version$/Applications/
Как только вы найдете свое приложение, вам нужно углубиться, чтобы найти sqlite db (обычно он находится в разделе "Документы" ).
Ответ 10
Ответом для новичков, как я был, я потратил довольно много времени, чтобы выяснить это. Шаги, которым я следовал:
- Откройте искатель и нажмите
Command(Windows) + Shift + G
- Перейдите в папку add
~/Library/Developer
- Найдите имя базы данных, которую вы создали, поскольку в моем случае это был
my.db
в SQLite. - Загрузите и установите браузер БД для SQLite.
- Нажмите открыть базу данных.
- Теперь перетащите файл БД из вашего искателя.
Ответ 11
Извините за столь поздний ответ
я не смог найти его в папке симулятора 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
Ответ 12
Другие решения либо устарели, либо не могут легко или быстро направить вас к файлам 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> Go> Перейти в папку
Ответ 13
Просто добавьте в viewDidLoad:
debugPrint(FileManager.default.urls(for: .documentDirectory, in: .userDomainMask))
Ответ 14
Вы можете рассмотреть print
для некоторой быстрой отладки. (Преимущество состояло бы в том, что вы можете выполнить некоторую простую отладку, не покидая XCode.)
Например, для объекта "Животные" с атрибутом "AnimalName" попробуйте это -
var animals: [NSManagedObject]!
for var i = 0 ; i < animals.count ; i++ {
print(animals[i].valueForKey("AnimalName") as! String)
}
Ответ 15
Если вы уже имеете доступ к 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");
}