Swift CoreData Пустые строки без определенной связи - PullRequest
1 голос
/ 03 апреля 2020

У меня есть пустые строки в таблице sqlite на устройстве, но нулевые данные были удалены из запроса API, они не связаны между таблицами Searches и Albums.

Мой основной контроллер данных определяет контекст и сохраните метод.

import Foundation
import CoreData

class CoreDataController {

    private init() {}

    static let shared = CoreDataController()

    var mainContext: NSManagedObjectContext {

        return persistentContainer.viewContext
    }

    lazy var persistentContainer: NSPersistentContainer = {

        let container = NSPersistentContainer(name: "PerfectTune")
        container.loadPersistentStores(completionHandler: { (_, error ) in

            if let error = error as NSError? {

                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        return container
    }()

    // MARK: - Core Data Saving Support
    func saveContext() -> Bool {

        let context = persistentContainer.viewContext
        if context.hasChanges {
            do {

                try context.save()
                return true
            } catch {

                let nserror = error as NSError
                fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
            }

        }

        return false
    }
}

Модель

import Foundation
import CoreData

class CoreDataModel {

    weak var delegate: DataReloadTableViewDelegate?
    let coreDataController: CoreDataController
    var items: [Albums] = []

    init(_ coreDataController: CoreDataController) {
        self.coreDataController = coreDataController
        self.coreDataController.mainContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
    }

    internal func saveSearchAlbums(responseData: Root) throws {

        let newSearch = Searches(context: coreDataController.mainContext)

        newSearch.searchQuery = responseData.attr.forField

        for (_, element) in responseData.albumMatches.album.enumerated() {

            let newAlbum = Albums(context: coreDataController.mainContext)

            let artistName = element.artist
            let albumName = element.name
            let imageUrlTwo = element.image[2].text
            let imageUrlZero = element.image[0].text
            let imageUrlOne = element.image[1].text

            var imageUrl: String = ""

            if !JustLetters.blank(text: imageUrlZero) {
                imageUrl = imageUrlZero
            }

            if !JustLetters.blank(text: imageUrlOne) {
                imageUrl = imageUrlOne
            }

            if !JustLetters.blank(text: imageUrlTwo) {
                imageUrl = imageUrlTwo
            }

            if !JustLetters.blank(text: artistName) && !JustLetters.blank(text: albumName) && !JustLetters.blank(text: imageUrl) {

                newAlbum.searches = newSearch
                newAlbum.artist = artistName
                newAlbum.name = albumName
                newAlbum.imageUrl = imageUrl

                newSearch.addToAlbums(newAlbum)
            }
        }
        // Save context
        _ = coreDataController.saveContext()
        fetchAlbumsByKeyword(searchTerm: responseData.attr.forField)
    }

    internal func fetchAlbumsByKeyword(searchTerm: String) {

        // Create Fetch Request
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Albums")

        // Add Sort Descriptor
        let sortDescriptor = NSSortDescriptor(key: "name", ascending: true)
        fetchRequest.sortDescriptors = [sortDescriptor]

        // Add Predicate
        let predicate = NSPredicate(format: "name CONTAINS[c] %@", searchTerm)
        fetchRequest.predicate = predicate

        do {
            items = try  coreDataController.mainContext.fetch(fetchRequest) as! [Albums]
        } catch {
            print(error)
        }
        delegate!.reloadAlbumsTable()
    }

    internal func fetchAllAlbums() {

        // Create the FetchRequest for all searches
        let allAlbums: NSFetchRequest = Albums.fetchRequest()

        do {
            items = try coreDataController.mainContext.fetch(allAlbums)
        } catch {
            print(error)
        }
    }
}

enter image description here

Связь с поиском не определена.

enter image description here

Модель CoreData

Ограничения установлены для поддержки уникального набора записей.

enter image description here enter image description here enter image description here enter image description here

1 Ответ

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

Похоже, это условие:

if !JustLetters.blank(text: artistName) && !JustLetters.blank(text: albumName) && !JustLetters.blank(text: imageUrl) { ...

не выполняется. Я предполагаю, что ваш запрос API возвращает строки, в которых некоторые полей равны нулю. Попробуйте составить выражения с помощью OR вместо AND:

if !JustLetters.blank(text: artistName) || !JustLetters.blank(text: albumName) || !JustLetters.blank(text: imageUrl) { ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...