iOS Быстрая проблема с сохранением основных данных: потеряны и неработоспособны - PullRequest
1 голос
/ 01 августа 2020

Возможно, я сделал действительно глупую вещь.

При написании обновления для моего (первого) отправленного приложения я изменил схему моей модели Core Data, добавив еще одну сущность (Issuer) и создав связь to-many с существующим объектом (Coin). Я думал, что облегченная миграция успешно внесла изменения:

До:

enter image description here

After:

enter image description here

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 Coins, 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 Coins, 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, но меня очень смущает, какую БД я загружаю - это оригинал или созданный дублированным проектом? У них обоих одно и то же имя, но одна из них имеет оригинальные записи, а другая - только одну.

Есть идеи, как я могу спастись? Я в замешательстве и в отчаянии! С радостью предоставим любую необходимую информацию или код.

Вся помощь глубоко признательна!

...