Подтвердить что ты не робот

Как я могу проверить, что хранится в моей базовой базе данных?

Я делаю приложение, которое опирается на Core Data. Я могу ввести данные в текстовое поле и сохранить его.

Но мне нужно знать, хранятся ли данные.

Я пытаюсь сделать detailView для моего tableView, и я не получаю никаких результатов. Теперь мне интересно, потому что я делаю что-то не так с моим кодом или данные хранятся правильно.

Как посмотреть, что хранится в базе данных приложения CoreData?

4b9b3361

Ответ 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

введите описание изображения здесь

  1. (Необязательно) Преобразуйте этот рабочий процесс в приложение, сохраните его и перетащите в свою док-станцию. Чтобы обновить базу данных, просто нажмите значок приложения.

Ответ 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

Ответом для новичков, как я был, я потратил довольно много времени, чтобы выяснить это. Шаги, которым я следовал:

  1. Откройте искатель и нажмите Command(Windows) + Shift + G
  2. Перейдите в папку add ~/Library/Developer
  3. Найдите имя базы данных, которую вы создали, поскольку в моем случае это был my.db в SQLite.
  4. Загрузите и установите браузер БД для SQLite.
  5. Нажмите открыть базу данных.
  6. Теперь перетащите файл БД из вашего искателя.

Ответ 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)

Вот определение метода полезности для

/**
 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");
}