CoreDataExtensions
CocoaPods
use_frameworks!
pod 'YFCoreData'
使用
1 数据模型
先看例子中的 Data Model
示例中的数据模型
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!
}
}