YFCoreData 4.2.0

YFCoreData 4.2.0

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最后发布2018年12月
支持支持 SPM

Xiaoye__220维护。



  • 作者
  • Xiaoye__220

pod iOS lisence swift

CoreDataExtensions

CocoaPods

use_frameworks!
pod 'YFCoreData'

使用

1 数据模型

先看例子中的 Data Model

示例中的数据模型

DataModel

2 ManagedObjectType

实体需要实现 ManagedObjectType 协议,该协议通过实体名和默认 NSSortDescriptor 进行实现,并提供根据 Dictionary 给实体赋值的功能。

实体应实现 ManagedObjectType 协议。

extension Father: ManagedObjectType {
    public static var entityName: String {
        return "Father"
    }
    
    public static var defaultSortDescriptors: [NSSortDescriptor] {
        return []
    }
}

3.使用方法

(1)数据源

自定义 dict 用来存储需要处理的数据。

dict 用来保存需要存储的数据

var dicts: [[String: Any]] {
        var dicts: [[String: Any]] = []
        for i in 1 ... 10 {
            let dict =  ["id": i,
                         "name": "Li lei",
                         "age": 25,
                         "children": [["id": 2*i-1, "name": "Ding ding", "age": 1],
                                      ["id": 2*i, "name": "La la", "age": 2]],
                         "parent": ["id": i,
                                    "name": "Li gang",
                                    "age": 50]] as [String : Any]
            dicts.append(dict)
        }
        return dicts
    }

(2)初始化

let cd = CoreData<Father>()

CoreDataStack.dataModelName = "Person"

dataModelName 是 .xcdatamodeld 文件的名字

dataModelName 是 .xcdatamodeld 文件的名称

(3)保存

cd.concurrencyType(.mainQueue_sync)
    .saveDataCount(10)
    .configure { (index, person) in
        person.updateFromDictionary(dict: self.dicts[index])
    }
    .completion { (success, _) in
        print("\(Thread.current)\nsync save \(success ? "success" : "fail")")
    }
    .save()

上面 person.updateFromDictionary(dict: self.dicts[index]) 可以通过字典给实体初始化,如果实体之间存在关联关系,也可以实现其中的关系。当然,也可以通过自己的方式为实体赋值。

person.updateFromDictionary(dict: self.dicts[index]) 可以通过字典更新实体。如果实体之间存在关系,这些关系也可以实现。当然,你也可以根据自己的方式为实体赋值。

(4)删除

cd.concurrencyType(.mainQueue_sync)
    .fetchRequest { _ in }
    .completion { (success, _) in
        print("\(Thread.current)\nsync delete \(success ? "success" : "fail")")
    }
    .delete()

fetchRequest 用于选择需要删除的实体

fetchRequest 用于获取需要删除的实体

(5)更新

cd.concurrencyType(.mainQueue_sync)
    .fetchRequest { request in
        request.predicate(NSPredicate(format: "name = %@", "1.Li lei"))
    }
    .configure { (index, person) in
        person.name = "Bob"
    }
    .completion { (success, _) in
        print("\(Thread.current)\nsync update \(success ? "success" : "fail")")
    }

(6) 阅读

cd.concurrencyType(.mainQueue_sync)
    .fetchRequest { request in
        request.predicate(NSPredicate(format: "name = %@", "Li lei"))
        .fetchLimit(1)
        .resultType(.managedObjectResultType)
        ......
    }
    .completion { (success, results) in
        print("\(Thread.current)\nsync find \(success ? "success" : "fail")")
        let persons = results as! [Father]
        print("result count: \(persons.count)")
    }
    .read()

4.NSFetchedResultsController

除了以上功能,还对 NSFetchedResultsController 进行了一些封装

添加了一些 NSFetchedResultsController 扩展。操作数据库将直接更新表格视图。

使用方法

class NSFetchedResultsViewController: UITableViewController {

    var fetchedResultsManager: FetchedResultsManager<Father>!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // init FetchedResultsManager
        fetchedResultsManager = FetchedResultsManager<Father>(contextType: .privateContext, tableView: tableView, sectionName: nil, cacheName: nil, fetchRequestConfigure: nil)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int {
        return fetchedResultsManager.numberOfSections()
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return fetchedResultsManager.numberOfItemsInSection(section)
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        var cell = tableView.dequeueReusableCell(withIdentifier: "cell")
        if cell == nil {
            cell = UITableViewCell.init(style: .default, reuseIdentifier: "cell")
        }
        let obj = fetchedResultsManager.objectAtIndexPath(indexPath)
        cell?.textLabel?.text = "id: " + String(obj.id) + "  name: " + obj.name!
        return cell!
    }
    
}