CoreDataManager
CoreDataManager是一个用于简化Core Data设置和JSON数据同步的层
用法
要运行示例项目,首先克隆仓库,然后从示例目录中运行pod install
。
最低要求
- iOS 9.0
- Xcode 11.0
安装
CoreDataManager 可通过 CocoaPods 获取。使用以下命令进行安装:
$ gem install cocoapods
要将 CoreDataManager 安装到项目中,请向项目的根目录添加一个名为 Podfile
的文件,其内容类似于以下示例:
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '9.0'
use_frameworks!
pod 'CoreDataManager', '~> 0.9.0'
然后,运行以下命令:
$ pod install
设置
在您的 AppDelegate 中设置持久存储
import CoreDataManager
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
CoreDataManager.sharedInstance.setupWithModel("CoreDataManager")
return true
}
设置 CoreDataManager 的可能方式
// Just replace your data model name
CoreDataManager.sharedInstance.setupWithModel("CoreDataManager")
// Replace your data model name and specify database file name.
CoreDataManager.sharedInstance.setupWithModel("CoreDataManager", andFileName: "CoreDataManager.sqlite")
// Replace your data model name and specify full URL to database file when the database shouldn't be in the user's documents directory.
let databaseURL = ...
CoreDataManager.sharedInstance.setupWithModel("CoreDataManager", andFileURL: databaseURL)
// Use in memory store for testing
CoreDataManager.sharedInstance.setupInMemoryWithModel("CoreDataManager")
托管对象上下文
let cdm = CoreDataManager.sharedInstance
// Main context for UIKit
let mainCtx = cdm.mainContext
// Background context for making updates
let backgroundCtx = cdm.backgroundContext
获取托管对象
// Array of employees
let employees = mainCtx.managerFor(Employee.self).array
// Count of employees
let employeeCount = mainCtx.managerFor(Employee.self).count
// First / last employee
let oldestEmployee = mainCtx.managerFor(Employee.self).orderBy("age").first
let youngestEmployee = mainCtx.managerFor(Employee.self).orderBy("age").last
过滤托管对象
过滤方法接受谓词,并可以与初始化 NSPredicate 时相同的参数调用
let youngEmployeeManager = mainCtx.managerFor(Employee.self).filter("age < 40")
// Young employees
let youngEmployees = youngEmployeeManager.array
// Count of young employees
let youngEmployeeCount = youngEmployeeManager.count
排序托管对象
在属性前应用减号 (-) 将使排序降序
// Ascending array of employees ordered by age
let employeesFromYoungest = mainCtx.managerFor(Employee.self).orderBy(["age", "name"]).array
// Descending array of employees ordered by age
let employeesFromOldest = mainCtx.managerFor(Employee.self).orderBy(["-age", "name"]).array
聚合管理对象
// Age of the youngest employee
let ageOfYoungestEmployee = mainCtx.managerFor(Employee.self).min("age")
// Age of the oldest employee
let ageOfOldestEmployee = mainCtx.managerFor(Employee.self).max("age")
// Total age of the employees
let totalAgeOfEmployees = mainCtx.managerFor(Employee.self).sum("age")
// Average age of the employees
let avgAgeOfEmployees = mainCtx.managerFor(Employee.self).aggregate("average", forKeyPath: "age")
删除管理对象
// Delete employees older than 100
backgroundCtx.performBlock { () -> Void in
backgroundCtx.managerFor(Employee.self).filter("age > 100").delete()
backgroundCtx.save()
}
序列化器
序列化器变量
identifiers
[字符串] - 来自映射的属性,用于标识在同步数据时更新的特定对象实例。如果在本地数据库中没有找到实例,则创建一个新实例并将其保存到数据库中。默认为空列表。
forceInsert
布尔 - 如果设置为 true,则在本地数据库中不会检查匹配的实例,并将所有同步数据插入其中。默认为 false。
insertMissing
布尔 - 确定是否应将未在本地数据库中找到的实例插入数据库。此选项在 forceInsert 设置为 true 时会被忽略。默认为 true。
updateExisting
: 布尔 - 确定是否应更新在本地的数据库中找到的实例。如果 forceInsert 设置为 true,则此选项会被忽略。默认为 true。
deleteMissing
布尔 - 确定是否应删除在同步数据中找不到但在本地数据库中存在的实例。默认为 true。
mapping
[字符串: CDMAttribute] - 定义了创建管理对象实例的映射。 默认为空字典
序列化器方法
func getValidators() -> [CDMValidator]
- 定义序列化器的验证器。每个验证器在开始同步之前运行。每个验证器逐个获取同步数据的每个项目作为 JSON 并返回修改后的值为 JSON。验证器也可以返回 nil 如果验证未通过 - 这在随后的同步中不予考虑。
func getGroupers() -> [NSPredicate]
- 分组器是一组谓词,定义了一个同步操作的数据库中存储的管理对象的子组。子组外的实例会被忽略并保持不变。
序列化器映射属性
CDMAttributeString
- 将在json中找到的数据转换为String
CDMAttributeBool
- 将在json中找到的数据转换为Bool
CDMAttributeInt
- 将在json中找到的数据转换为Int
CDMAttributeNumber
- 将在json中找到的数据转换为NSNumber
CDMAttributeDouble
- 将在json中找到的数据转换为Double
CDMAttributeFloat
- 将在json中找到的数据转换为Float
CDMAttributeISODate
- 使用ISO格式将json中的数据转换为NSDate - yyyy-MM-dd'T'HH:mm:ssZZZZZ 或 yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ
CDMAttributeToMany
- 将json中的数据转换为NSManagedObject的NSSet
CDMAttributeToOne
- 将json中的数据转换为NSManagedObject
在初始化返回管理对象属性时,需要定义一个回调函数,用于序列化和匹配管理对象。
序列化器示例
// Create serializers for `Department` and `Employee` - both NSManagedObject subclasses
class DepartmentSerializer<T:Department>: CDMSerializer<T> {
override init() {
super.init()
self.identifiers = ["departmentID"]
self.mapping = [
"departmentID": CDMAttributeNumber(["id"]),
"name": CDMAttributeString(["name"]),
]
}
}
class EmployeeSerializer<T:Employee>: CDMSerializer<T> {
override init() {
super.init()
self.identifiers = ["employeeID"]
self.mapping = [
"employeeID": CDMAttributeNumber(["id"]),
"fullName": CDMAttributeString(["user", "name"]),
"department": CDMAttributeToOne(["department"], serializerCallback: {departmentJSON in
let departmentSerializer = DepartmentSerializer()
// Don't update nor delete the objects in child serializer
// Just match the department
departmentSerializer.updateExisting = false
departmentSerializer.deleteMissing = false
return departmentSerializer
}),
]
}
}
同步JSON数据
let serializer = EmployeeSerializer()
let jsonData = JSON([
[
"id": 1,
"user": ["id": 5, "name": "Mary"],
"department": ["id": 2, "name": "iOS development"]
],[
"id": 2,
"user": ["id": 6, "name": "David"],
"department": ["id": 2, "name": "iOS development"]
]
])
let context = CoreDataManager.sharedInstance.backgroundContext
context.syncData(jsonData, withSerializer: serializer) { (error) -> Void in
// Sync completed
// Employees Mary and David have been inserted or updated in core data. Other employees have been deleted
}
作者
塔维亚·特斯卡 (Thorgate)
依赖项
所有依赖项在使用CocoaPods时会自动安装
致谢
CoreDataManager使用了来自CoreDataSimpleDemo示例的某些想法来管理对象上下文
许可证
CoreDataManager采用MIT许可证。有关更多详细信息,请参阅LICENSE文件。