Swift 没有定义关系的 CoreData 空白行

Swift CoreData Blank Rows Without Defined Relationship

我在设备上的 sqlite table 中有空白行,但是空数据已从 API 请求中删除,它与搜索和相册之间没有关系 table .

我的核心数据控制器定义了上下文和保存方法。

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)
        }
    }
}

未定义与搜索的关系。

CoreData 模型

设置约束以维护唯一的记录集。

看起来像这样的条件:

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) { ...