首页 > 解决方案 > CRUD 操作 - 删除重复代码

问题描述

我尝试同步CoreData来自后端 SQL 服务器的实体和表之间的所有属性,我刚刚意识到我正在重复使用 3 次相同的属性CRUD(读取、插入和更新)。如果您有一个具有很多属性的实体,那么代码量就像我的情况一样巨大。有什么办法可以删除这个代码重复?

以下是 CRUD 操作:

override func retrieveAndBuildRowUsing(tblRow: TRow) {

        remoteDefectTemplate = DefectTemplate(context: managedContext)

        remoteDefectTemplate.id = Int64(                                tblRow.getCell(columnName: DefectTemplateContract.Columns.id)?.iData() ?? -1)
        remoteDefectTemplate.templateId = Int64(                        tblRow.getCell(columnName: DefectTemplateContract.Columns.templateId)?.iData() ?? -1)
        remoteDefectTemplate.compCode =                                 tblRow.getCell(columnName: DefectTemplateContract.Columns.companyCode)?.sData
        remoteDefectTemplate.siteNo = Int64(                            tblRow.getCell(columnName: DefectTemplateContract.Columns.driverSiteNumber)?.iData() ?? -1)
        remoteDefectTemplate.title =                                    tblRow.getCell(columnName: DefectTemplateContract.Columns.title)?.sData
        remoteDefectTemplate.descript =                                 tblRow.getCell(columnName: DefectTemplateContract.Columns.description)?.sData
        remoteDefectTemplate.odo =                                      tblRow.getCell(columnName: DefectTemplateContract.Columns.odometer)?.boolData() ?? Bool()
        remoteDefectTemplate.fuel =                                     tblRow.getCell(columnName: DefectTemplateContract.Columns.fuel)?.boolData() ?? Bool()
        remoteDefectTemplate.oil =                                      tblRow.getCell(columnName: DefectTemplateContract.Columns.oil)?.boolData() ?? Bool()
        remoteDefectTemplate.adBlue =                                   tblRow.getCell(columnName: DefectTemplateContract.Columns.adblue)?.boolData() ?? Bool()
        remoteDefectTemplate.defectCreated =                            tblRow.getCell(columnName: DefectTemplateContract.Columns.created)?.dtData() ?? Date()
        remoteDefectTemplate.defectUpdated =                            tblRow.getCell(columnName: DefectTemplateContract.Columns.updated)?.dtData() ?? Date()
        remoteDefectTemplate.declarationNilDefect =                     tblRow.getCell(columnName: DefectTemplateContract.Columns.declarationNilDefect)?.sData
        remoteDefectTemplate.declarationPG9Defect =                     tblRow.getCell(columnName: DefectTemplateContract.Columns.declarationPG9Defect)?.sData
        remoteDefectTemplate.declarationDefect =                        tblRow.getCell(columnName: DefectTemplateContract.Columns.declarationDefect)?.sData
        remoteDefectTemplate.mapId = Int64(                             tblRow.getCell(columnName: DefectTemplateContract.Columns.damageBitmapId)?.iData() ?? -1)
        remoteDefectTemplate.map = Data(                                tblRow.getCell(columnName: DefectTemplateContract.Columns.damageBitmap)?.binData() ?? [UInt8]())
        remoteDefectTemplate.lastVehicleMOTDateRequired =               tblRow.getCell(columnName: DefectTemplateContract.Columns.lastVehicleMOTDateRequired)?.boolData() ?? Bool()
        remoteDefectTemplate.lastTrailerMOTDateRequired =               tblRow.getCell(columnName: DefectTemplateContract.Columns.lastTrailerMOTDateRequired)?.boolData() ?? Bool()
        remoteDefectTemplate.nextTrailerSafetyInspectionDateRequired =  tblRow.getCell(columnName: DefectTemplateContract.Columns.nextTrailerSafetyInspectionDateRequired)?.boolData() ?? Bool()
        remoteDefectTemplate.vehicleHeightCmRequired =                  tblRow.getCell(columnName: DefectTemplateContract.Columns.vehicleHeightCmRequired)?.boolData() ?? Bool()
    }


override func createRow() {

        let localDefectTemplate = NSEntityDescription.insertNewObject(forEntityName: "DefectTemplate", into: managedContext) as! DefectTemplate

        localDefectTemplate.id =                                        remoteDefectTemplate.id
        localDefectTemplate.templateId =                                remoteDefectTemplate.templateId
        localDefectTemplate.compCode =                                  remoteDefectTemplate.compCode
        localDefectTemplate.siteNo =                                    remoteDefectTemplate.siteNo
        localDefectTemplate.title =                                     remoteDefectTemplate.title
        localDefectTemplate.descript =                                  remoteDefectTemplate.descript
        localDefectTemplate.odo =                                       remoteDefectTemplate.odo
        localDefectTemplate.fuel =                                      remoteDefectTemplate.fuel
        localDefectTemplate.oil =                                       remoteDefectTemplate.oil
        localDefectTemplate.adBlue =                                    remoteDefectTemplate.adBlue
        localDefectTemplate.defectCreated =                             remoteDefectTemplate.defectCreated
        localDefectTemplate.defectUpdated =                             remoteDefectTemplate.defectUpdated
        localDefectTemplate.declarationNilDefect =                      remoteDefectTemplate.declarationNilDefect
        localDefectTemplate.declarationPG9Defect =                      remoteDefectTemplate.declarationPG9Defect
        localDefectTemplate.declarationDefect =                         remoteDefectTemplate.declarationDefect
        localDefectTemplate.mapId =                                     remoteDefectTemplate.mapId
        localDefectTemplate.map =                                       remoteDefectTemplate.map
        localDefectTemplate.lastVehicleMOTDateRequired =                remoteDefectTemplate.lastVehicleMOTDateRequired
        localDefectTemplate.lastTrailerMOTDateRequired =                remoteDefectTemplate.lastTrailerMOTDateRequired
        localDefectTemplate.nextTrailerSafetyInspectionDateRequired =   remoteDefectTemplate.nextTrailerSafetyInspectionDateRequired
        localDefectTemplate.vehicleHeightCmRequired =                   remoteDefectTemplate.vehicleHeightCmRequired

        do {
            try managedContext.save()
            print("Inserted successfully a row with id: \(localDefectTemplate.id) in DefectTemplate.")
        } catch {
            print("Insert failed in DefectTemplate: \(error)")
        }
    }


override func updateRowWith(idToUpdate: Int64) {

        guard let defectTemplatepRowToUpdate = try! DefectTemplate.fetchId(id: "\(idToUpdate)", context: managedContext) else {
            print("Error while fetching the idToUpdate from DefectTemplate.")
            return
        }

        defectTemplatepRowToUpdate.id =                                         remoteDefectTemplate.id
        defectTemplatepRowToUpdate.templateId =                                 remoteDefectTemplate.templateId
        defectTemplatepRowToUpdate.compCode =                                   remoteDefectTemplate.compCode
        defectTemplatepRowToUpdate.siteNo =                                     remoteDefectTemplate.siteNo
        defectTemplatepRowToUpdate.title =                                      remoteDefectTemplate.title
        defectTemplatepRowToUpdate.descript =                                   remoteDefectTemplate.descript
        defectTemplatepRowToUpdate.odo =                                        remoteDefectTemplate.odo
        defectTemplatepRowToUpdate.fuel =                                       remoteDefectTemplate.fuel
        defectTemplatepRowToUpdate.oil =                                        remoteDefectTemplate.oil
        defectTemplatepRowToUpdate.adBlue =                                     remoteDefectTemplate.adBlue
        defectTemplatepRowToUpdate.defectCreated =                              remoteDefectTemplate.defectCreated
        defectTemplatepRowToUpdate.defectUpdated =                              remoteDefectTemplate.defectUpdated
        defectTemplatepRowToUpdate.declarationNilDefect =                       remoteDefectTemplate.declarationNilDefect
        defectTemplatepRowToUpdate.declarationPG9Defect =                       remoteDefectTemplate.declarationPG9Defect
        defectTemplatepRowToUpdate.declarationDefect =                          remoteDefectTemplate.declarationDefect
        defectTemplatepRowToUpdate.mapId =                                      remoteDefectTemplate.mapId
        defectTemplatepRowToUpdate.map =                                        remoteDefectTemplate.map
        defectTemplatepRowToUpdate.lastVehicleMOTDateRequired =                 remoteDefectTemplate.lastVehicleMOTDateRequired
        defectTemplatepRowToUpdate.lastTrailerMOTDateRequired =                 remoteDefectTemplate.lastTrailerMOTDateRequired
        defectTemplatepRowToUpdate.nextTrailerSafetyInspectionDateRequired =    remoteDefectTemplate.nextTrailerSafetyInspectionDateRequired
        defectTemplatepRowToUpdate.vehicleHeightCmRequired =                    remoteDefectTemplate.vehicleHeightCmRequired

        do {
            try managedContext.save()
            print("Inserted a row successfully in DefectTemplate!")
        } catch {
            print("Insert failed in DefectTemplate: \(error)")
        }
    }

以下是我的CoreData实体的属性:

extension DefectTemplate {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<DefectTemplate> {
        return NSFetchRequest<DefectTemplate>(entityName: "DefectTemplate")
    }

    @NSManaged public var id: Int64
    @NSManaged public var templateId: Int64
    @NSManaged public var compCode: String?
    @NSManaged public var siteNo: Int64
    @NSManaged public var title: String?
    @NSManaged public var descript: String?
    @NSManaged public var odo: Bool
    @NSManaged public var fuel: Bool
    @NSManaged public var oil: Bool
    @NSManaged public var adBlue: Bool
    @NSManaged public var defectCreated: Date
    @NSManaged public var defectUpdated: Date
    @NSManaged public var declarationNilDefect: String?
    @NSManaged public var declarationPG9Defect: String?
    @NSManaged public var declarationDefect: String?
    @NSManaged public var mapId: Int64
    @NSManaged public var map: Data?
    @NSManaged public var lastVehicleMOTDateRequired: Bool
    @NSManaged public var lastTrailerMOTDateRequired: Bool
    @NSManaged public var nextTrailerSafetyInspectionDateRequired: Bool
    @NSManaged public var vehicleHeightCmRequired: Bool

    class func fetchId(id: String, context: NSManagedObjectContext) throws -> DefectTemplate? {
        let fetchRequest: NSFetchRequest<DefectTemplate> = DefectTemplate.fetchRequest()
        fetchRequest.predicate = NSPredicate(format: "id = %@", id)
        return try context.fetch(fetchRequest).first
    }

    class func fetchTemplateId(templateId: String, context: NSManagedObjectContext) throws -> DamageTemplate? {
        let fetchRequest: NSFetchRequest<DamageTemplate> = DamageTemplate.fetchRequest()
        fetchRequest.propertiesToFetch = ["id"]
        fetchRequest.predicate = NSPredicate(format: "templateId = %@", templateId)
        return try context.fetch(fetchRequest).first
    }

    class func fetchIdToUpdateUsing(templateId: String, compCode: String, context: NSManagedObjectContext) throws -> Int64? {
        let fetchRequest: NSFetchRequest<DamageTemplate> = DamageTemplate.fetchRequest()
        fetchRequest.propertiesToFetch = ["id"]
        fetchRequest.predicate = NSPredicate(format: "templateId = %@ AND compCode = %@", templateId, compCode)

        let listOfIds = try context.fetch(fetchRequest)

        if listOfIds.count == 1 {
            return listOfIds.first?.id
        }
        else {
            return -1
        }
    }
}

感谢您阅读本文!

标签: iosswift

解决方案


推荐阅读