Расположение файла Apple XCode CoreData SQLite продолжает двигаться - PullRequest
0 голосов
/ 03 апреля 2020

Я пишу свое первое приложение CoreData в Swift и SwiftUI. У меня есть основы работы, и я очень доволен этим. Я использую SQLiteStudio 3.2.1, чтобы иметь возможность просматривать БД независимо от моего кода. Я могу довольно легко найти файл * .sqlite, используя параметры времени выполнения CoreData в XCode (11.4) "-com.apple.CoreData.SQLDebug 3" и "-com.apple.CoreData.Logging.stderr 1". Все работает хорошо.

Проблема, с которой я сталкиваюсь, время от времени вызывает то, что SQLiteStudio перестает показывать обновления, которые делает приложение при отладке, а отлаженное приложение в симуляторе видит только новые записи, а не то, что уже было в БД. Я был немного смущен, но потом я сделал 'find' для файла * .sqlite и обнаружил, что он время от времени переключается на новый файл. Я подумал, может быть, он сделал новый файл, если я остановился и запустил симулятор, но когда я попытался, он не создал новый файл. Я подумал, может быть, если я выключу XCode и снова запустлю его, он создаст новый файл, но это также не создаст новый файл. Кажется, новый файл создается почти случайно.

Кто-нибудь знает, что заставляет XCode генерировать новый файл * .sqlite для приложений, которые он запускает? Я хотел бы отключить его, чтобы он продолжал использовать один и тот же файл * .sqlite, что облегчит тестирование.

Спасибо за любые идеи.

1 Ответ

0 голосов
/ 05 апреля 2020

Итак, я нашел решение своей проблемы. Оказывается, что Core Data создает URL-адрес, по которому он будет хранить БД при создании объекта NSPersistentContainer, и сохраняет его в массиве объектов NSPersistentStoreDescription, которые он хранит. Я предполагаю, что внутри Core Data есть код, который создает этот URL из ряда свойств, включая то, что имитатор предназначен для запуска под XCode. Следовательно, если симулятор меняется, или приложение удаляется и переустанавливается в симуляторе, когда XCode запускает новый, он видит новое местоположение для симулятора и использует его в качестве базового пути для объекта URL, который Core Data использует для поиска базы данных SQLite.

Поэтому, поскольку я хочу исправить БД в фиксированном месте, пока я создаю и отлаживаю приложение, я просто перезаписал объект URL в объекте NSPersistentStoreDescription в массиве внутри контейнера объектом URL, который указывает на где я хотел, чтобы БД приземлился. Я обернул это в условную компиляцию #if DEBUG, чтобы случайно не оставить этот код в производственной сборке.

Для этого я добавил код в AppDelegate при создании отложенной загрузки Постоянного контейнера (кода, сгенерированного XCode). Код выглядит следующим образом (единственный новый код - это код в условной компиляции);

lazy var persistentContainer: NSPersistentContainer = {

let container = NSPersistentContainer(name: "TestDB")

#if DEBUG
  container.persistentStoreDescriptions[0].url = 
     URL(fileURLWithPath: "/Users/justme/Documents/code/data/TestDB.sqlite")
#endif

Я проверил это, и похоже, что он работает нормально. Если БД не существует, она создается по этому пути, а если она уже существует, она используется. Я могу удалить приложение, а затем перезапустить, и оно все еще использует тот же экземпляр БД.

Я надеюсь, что это помогает другим, и спасибо 'zaitsman' за то, что он дал мне немного фона, который помог мне наметить путь, чтобы сделать это работа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...