Возможно, я сделал действительно глупую вещь.
При написании обновления для моего (первого) отправленного приложения я изменил схему моей модели Core Data, добавив еще одну сущность (Issuer
) и создав связь to-many
с существующим объектом (Coin
). Я думал, что облегченная миграция успешно внесла изменения:
До:
After:
Here's the Core Data stack, created automatically when I created the project:
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "Coin_Portfolio")
let description = NSPersistentStoreDescription()
description.shouldInferMappingModelAutomatically = true
description.shouldMigrateStoreAutomatically = true
container.persistentStoreDescriptions = [description]
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
return container
}()
In testing on my iPhone, I found that I could create Coin
s, like this:
func createNewCoin(){
guard let appDelegate =
UIApplication.shared.delegate as? AppDelegate else {
return
}
let context = appDelegate.persistentContainer.viewContext
newCoin = NSEntityDescription.insertNewObject(forEntityName: "Coin", into: context) as! Coin
if currentOwner.name == nil {
print("In NewCoin, createNewCoin, currentOwner is nil")
}else{
print("In NewCoin, createNewCoin, currentOwner is named \(String(describing: currentOwner.name))")
}
// Problem with contexts could be here! Compare DB for this app to test bed
newCoin.denomination = nil
newCoin.grade = nil
newCoin.itemIdentifier = ""
newCoin.mintMark = nil
currentOwner.addToCoins(newCoin)
saveIt()
}
func saveIt(){
guard let appDelegate =
UIApplication.shared.delegate as? AppDelegate else {
return
}
appDelegate.saveContext()
}
And retrieve it like this:
let context = appDelegate.persistentContainer.viewContext
let ownerFetchRequest :
NSFetchRequest = Issuer.fetchRequest()
do {
try ownerFRC?.performFetch()
owners = try context.fetch(ownerFetchRequest)
} catch {
fatalError("Failed to initialize FetchedResultsController: \(error)")
}
for owner in owners{
if owner.name == currentOwner.name{
currentOwnerCoinsByDenom = ((owner.coins?.allObjects as! [Coin]).sorted(by: { $0.denomination! < $1.denomination! }))
currentOwnerCoinsByYear = ((currentOwnerCoinsByDenom as! [Coin]).sorted(by: { $0.denomination! < $1.denomination! }))
print ("currentOwnerCoinsByDenom.count == \(currentOwnerCoinsByDenom)")
print(currentOwnerCoinsByDenom.count)
print ("currentOwnerCoinsByYear.count == \(currentOwnerCoinsByYear)")
print(currentOwnerCoinsByYear.count)
}
}
}
Fine, as long as I don't quit the app and relaunch it.
Upon relaunch, my fetch attempts return no Coin
s, even though I know that there had been some 80+ records stored in Core Data before the schema change.
I then started what I thought was a rational approach to solving the problem. See iOS данные, сохраненные в Core Data, не сохраняются при запуске . Полученные ответы, к сожалению, не решили проблему.
Соответственно, я запаниковал, зная, что мои пользователи не будут любезно терять свои собственные записи.
Вот где я мог сбежать с рельсов: я создал дублированный проект, чтобы попытаться решить проблему, не испортив оригинал. Но я по-прежнему сталкиваюсь с той же проблемой.
Я изучил базы данных с помощью браузера БД для SQLite, но меня очень смущает, какую БД я загружаю - это оригинал или созданный дублированным проектом? У них обоих одно и то же имя, но одна из них имеет оригинальные записи, а другая - только одну.
Есть идеи, как я могу спастись? Я в замешательстве и в отчаянии! С радостью предоставим любую необходимую информацию или код.
Вся помощь глубоко признательна!