Thanks to visit codestin.com
Credit goes to github.com

Skip to content

对Core Data增删改查的封装

qrices/LQCoreData

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 

Repository files navigation

LQCoreData

对Core Data增删改查的封装,同时提供了Swift版本与Objective-C版本,两个版本的使用方法一致,Demo中提供了增删改查的使用示例。

/// 增
    ///
    /// - Parameters:
    ///   - name: 实体(Entity)名称
    ///   - handler: 配置待保存数据回调
    ///   - rs: 保存结果回调
    class func insert(entity name: String, configHandler handler: ((_ obj: NSManagedObject) -> Void), resulteHandler rs: ((_ error: NSError? ) -> Void)? = nil)

这里主要说一下configHandler,其参数为NSManagedObject,为了提高复用性,在封装的方法中没有涉及到具体的entity,该回调方法就是供外部对具体entity进行赋值的入口,使用示例:

let names = ["夏侯惇", "貂蝉", "诸葛亮", "张三", "李四", "流火绯瞳", "流火", "李白", "张飞", "韩信", "范冰冰", "赵丽颖"]
        
        for i in 0...60 {
            
            LQCoreData.insert(entity: "PeopleEntity", configHandler: { (obj) in
                // 将回调的obj转换为具体的实体进行赋值
                let people = obj as! PeopleEntity
                people.name = names[i%names.count]
                people.age = Int16(arc4random() % 80 + UInt32(10))
                
            }, resulteHandler: { (error) in
                if let err = error {
                    print("保存失败\(err)")
                } else {
                    print("保存成功")
                }
            })
        }

提供了两种删除方法,单独删除和批量删除:

/// 删
    ///
    /// - Parameters:
    ///   - name: 实体(Entity)名称
    ///   - predicate: 删除条件
    ///   - result: 删除结果回调
    class func delete(entity name: String, predicate: NSPredicate? = nil, resultHandler rs: ((_ error: NSError?, _ deletedObjs: Array<Any>?) -> Void)? = nil)
    
/// 批量删除操作
    ///
    /// - Parameters:
    ///   - name: 实体(Entity)名称
    ///   - predicate: 查找条件
    ///   - handle: 结果回调
    class func batchDelete(entity name: String, predicate: NSPredicate, resultHandler handler: ((_ error: NSError?) -> Void)? = nil)

使用示例,删除年龄为30的:

let pre1 = LQCoreData.predicate(.equalTo(number: 30, forProperty: "age"))
        
        LQCoreData.delete(entity: "PeopleEntity", predicate: pre1) { (error, info) in
            if let err = error {
                print("err: \(err)")
            } else {
                print("所有年龄为30的已删除")
            }
        }

更新数据也是提供了两种方法,单个更新和批量更新:

/// 改
    ///
    /// - Parameters:
    ///   - name: 实体(Entity)名称
    ///   - predicate: 查询条件
    ///   - handler: 更新数据的回调
    ///   - result: 更新结果的回调
    class func update(withEntityName name: String, predicate: NSPredicate, configNewValues handler: ((_ objs: Array<Any>) -> Void), result: ((_ error: NSError?) -> Void)? = nil)
    
/// 批量更新
    ///
    /// - Parameters:
    ///   - name: 实体(Entity)名称
    ///   - predicate: 查询条件
    ///   - values: 更新的值, 字典; key: 待更新属性名称, value: 更新的值
    ///   - handle: 更新结果回调
    class func batchUpdate(entity name: String, predicate: NSPredicate, propertiesToUpdate values: Dictionary<String, Any>, resultHandler handler: ((_ error: NSError?) -> Void)? = nil)

例如,将所有的范冰冰,名称更新为哈哈哈:

let pre2 = LQCoreData.predicate(.match(string: "范冰冰", forProperty: "name"))
        
        LQCoreData.update(withEntityName: "PeopleEntity", predicate: pre2, configNewValues: { (datas) in
            
            for data in datas {
                let people = data as! PeopleEntity
                people.name = "哈哈哈哈"
                people.age = 100
            }
        }) { (error) in
            
            if let err = error {
                
                print("err: \(err)")
            } else {
                print("已更新")
            }
        }
/// 查
    ///
    /// - Parameters:
    ///   - name: 实体(Entity)名称
    ///   - predicate: 查询条件-谓词
    ///   - propertiesToFetch: 查询的属性, 默认所有属性
    ///   - key: 查询结果排序的依据属性, 升序
    ///   - result: 查询结果回调
    class func fetch(entity name: String, predicate: NSPredicate? = nil, propertiesToFetch: Array<Any>? = nil, resultSortKey key: String? = nil, resultHandler rs: @escaping ((_ info: Array<Any>?) -> Void))

例如,查找年龄小于50的:

let pre = LQCoreData.predicate(.smallThan(number: 50, forProperty: "age"))
        
        LQCoreData.fetch(entity: "PeopleEntity", predicate: pre) { (results) in
            print("**************************查询age小于50*******************************")
            if let rs = results {
                for info in rs {
                    let people = info as! PeopleEntity
                    print("name: \(people.name ?? " ") ----age: \(people.age)")
                }
            } else {
                print("查询失败")
            }
        }
条件谓词

另外单独封装了几个常用的条件谓词,可以直接调用相应的方法即可:

// MARK: - 预设的谓词查询条件 NSPredicate
enum LQPredicateType {
    
    case like(string: String, forProperty: String)
    case match(string: String, forProperty: String)
    case matchc(string: String, forProperty: String)
    case contain(string: String, forProperty: String)
    
    case equalTo(number: Int64, forProperty: String)
    case bigThan(number: Int64, forProperty: String)
    case smallThan(number: Int64, forProperty: String)
    
    case notBigThan(number: Int64, forProperty: String)
    case notSmallThan(number: Int64, forProperty: String)
}

更多内容可参考本人博客

以及一个, 在新版Xcode中使用的注意事项:

About

对Core Data增删改查的封装

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published