CoreDataManager 0.9.0

CoreDataManager 0.9.0

测试已测试
语言语言 SwiftSwift
许可 MIT
发布最新发布2019年10月
SPM支持SPM

Taavi Teska维护。



CoreDataManager

Version License Platform Twitter

CoreDataManager是一个用于简化Core Data设置和JSON数据同步的层

  1. 用法
  2. 最低要求
  3. 安装
  4. 设置
  5. 托管对象上下文
  6. 序列化器
  7. 同步JSON数据
  8. 作者
  9. 依赖
  10. 致谢
  11. 许可

用法

要运行示例项目,首先克隆仓库,然后从示例目录中运行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:ssZZZZZyyyy-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文件。