CBDCoreDataToolKit 3.3.1

CBDCoreDataToolKit 3.3.1

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
释放上次发布2016年10月

Colas Bardavid 维护。



  • Colas

CBDCoreDataToolKit: 在 CoreData 中轻松进行克隆、替换、导入(和一些有用的杂项方法)

使用 CBDCoreDataToolKit,您可以克隆、替换或导入您的 NSManagedObject。克隆在您想将新数据从 NSManagedObjectContext(一个 MOC)传输到另一个时很有用。导入是指当您想将某些数据“集成”到一个代码 MOC 到另一个 MOC 中时。通过集成,我指的是要导入的数据 并不 完全是新的。也许只是实体之间存在新的链接,或者可能只是一个具有许多与 现有 对象关系的实体的新实例。

在这种情况下需要理解的是

  • 克隆将“拖”起新对象连接的整个图,我们将有许多重复的。

  • 导入更聪明(但也更难)并将“拖”起新对象连接的整个图 以及 与现有图合并。 超级棒!

1. 克隆对象

您想从一个 MOC 复制一个对象(以及 与其相关的所有图)到另一个。 CBDCoreDataToolKit 可以做到这一点。它还将复制与第一个对象有关联的对象(以及递归),但您可以指定要忽略的实体或属性。

2. 使用另一个对象替换一个对象

假设您有一个包含许多相互关联的对象的图。您想用另一个对象替换该图中的对象,并且当然,您希望图保持不变。 CBDCoreDataToolKit 可以做到这一点。当您不必询问有关 MOC 的问题时:您可以取任何 NSManagedObject 并用另一个替换它。

3. 导入对象

这与克隆有些类似,但它更强大。虽然克隆是从 sourceMOC 将对象的所有图形(除了您可以剪除的部分)拉到 targetMOC,但导入功能更聪明。

a) CBDCoreDataImporter

要导入一些数据,很简单!

首先,您需要创建一个 CBDCoreDataImporter 的实例。您这样做:

CBDCoreDataImporter * myImporter;

myImporter = [CBDCoreDataImporter alloc] initWithSourceMOC:sourceMOC
                                                 targetMOC:targetMOC];

然后,为了导入

[myDataImporter import:object];

它将导入objecttargetMOC中,并将其包含在targetMOC中现有对象图形中。为此,CBDCoreDataImporter需要对sourceMOCtargetMOC中的对象进行比较。这是CBDCoreDataDiscriminator的目标。

b) CBDCoreDataDiscriminator

CBDCoreDataDiscriminator的实例旨在比较特定实体的对象,针对给定的属性和关系。它将使用(在初始化时给定)的属性和关系,而不是使用==isEqual:进行等式测试。

一些代码

CBDCoreDataDiscriminator * myDiscriminator ;

myDiscriminator = [CBDCoreDataDiscriminator alloc] initWithDefaultType] ;

[myDiscriminator    isSourceObject:firstObject
             similarToTargetObject:secondObject] ;


NSArray * similarObjects = [myDiscriminator similarObjectTo:refObject
                                                      inMOC:myMOC] ;

NSManagedObject * similarObject = [myDiscriminator firstSimilarObjectTo:refObject
                                                                  inMOC:myMOC] ;

你也可以做这类动作

[myDiscriminator    objectsInWorkingMOC:MOCWhereWeAreWorking
          alreadyExistingInReferenceMOC:referenceMOC] ;

但是,你可能想要非常精确地定义你想要在哪些属性和关系上执行所有这些操作:区分以及导入。这是可能的,并且它使用了CBDCoreDataDecisionCenterCBDCoreDataDecisionUnit

c) CBDCoreDataDecisionCenter和CBDCoreDataDecisionUnit

— CBDCoreDataDecisionUnit

Nested code snippet唠叨解释

  • 根据载人关系决策:在实体Person的情况下,仅考虑属性nameage和关系family来做出决策。(在这里,决策即是“告诉我他们是否相似”或“复制此实体”,但你可以想象其他情况)。

  • 在实体Car的情况下,不要考虑(我的意思是:永远不要)关系owners来做决策。

  • 忽略实体Bike

  • 等等。

最佳做法是查阅文档以了解更多关于代码的信息。

— CBDCoreDataDecisionCenter

CBDCoreDataDecisionCenter将多个CBDCoreDataDecisionUnit组合在一起。它是真正的决策者,因为在实体Entity继承自其他SuperEntity的情况下,如果这两个实体都有决策单元,则无法在没有了解这两个单元的情况下做出决策。

你不需要为所有实体指定决策单元。

你可以使用三种全局设置之一:`initWithFacilitatingType`、`initWithSemiFacilitatingType`、`initWithDemandingType`。它们都是方便的。更多信息请参见文档。

以下是某些代码

CBDCoreDataDecisionCenter * myDecisionCenter ;
myDecisionCenter = [CBDCoreDataDecisionCenter alloc] initWithSemiFacilitatingType] ;

CBDCoreDataDecisionUnit *myUnit1 ;
myUnit1 = [[CBDCoreDataDecisionUnit alloc] initForEntity:personEntity
                                         usingAttributes:nil
                                        andRelationships:@[@"friends"]] ;

CBDCoreDataDecisionUnit *myUnit2 ;
myUnit2 = [[CBDCoreDataDecisionUnit alloc] initForEntity:employeeEntity
                                         usingAttributes:nil
                                        andRelationships:@[@"employees"]] ;

[myDecisionCenter addDecisionUnit:myUnit1];
[myDecisionCenter addDecisionUnit:myUnit2];

[myDecisionCenter relationshipsFor:employeeEntity]

4. 获取便利方法

使用CoreData时,当你想获取信息时,它既复杂又重复。CBDCoreDataToolKit为你提供了便利的方法,以便快速达成目标。这些方法接受格式字符串,因此更具便利性。许多其他库也这样做,包括非常知名的马吉克记录(Magical Record)。不幸的是,马吉克记录不能与NSPersistentDocument一起工作。CBDCoreDataToolKit可以。

在Apple类中定义的所有方法都以_cbd_结尾,以避免名称冲突。

a) 用于获取NSManagedObject子类的方法

如果它们实现了类方法+ (NSString *)entityName或者它们的名字与相应的实体相同,则可以在NSManagedObject的子类上执行获取操作。这是由mogenerator生成的类的例子。

b) 完全支持格式字符串

您将能够进行如下操作

            [Person findInMOC:self.myMOC
                    orderedBy:@"name, age"
     withPredicateFormat_cbd_:@"city == %@", theCity] ;

5. 通用方法

TODO

(a)关联实体

TODO

(b)通用方法

TODO

需求

NSManagedObject+CBDActiveRecord类别中的某些方法需要满足以下条件之一

  • 您使用mogenerator生成了NSManagedObject的子类。
  • 对应您的EntityNSManagedObject子类也被命名为Entity

但是请不要担心,这个要求(实际上总是满足的)已经被限制在这个类别内。本库的其他部分不需要这个要求。

文档

类和方法的文档可在此处找到。

使用方法

要运行示例项目,请先从Example目录中克隆仓库,然后运行pod install

作者

Colas,[email protected]

特别感谢

变更日志

  • 2014/05/06 (v3.0.0)
    • 为对象数组的-clone...方法新增了@return:现在它返回一个映射旧对象到新对象的字典
    • CBDCoreDataDecisionUnit添加了便捷的初始化器
    • 新增了在两个MOC之间查找重复项的方法
    • 修正了各种错误
    • 不再有- removeLastHintremoveLastEntryOfTheCache方法
    • 添加了ConnectedEntities子库。
    • 修复了在allObject_cbd_countAllObjects_cbd_上的错误:它是多次计数的(当一个实体有子实体时)
  • 2014/02/18 (v2.0.0)
    • 引入了从MOC到另一个MOC的更高级的导入器。通过它们的图如身份进行比较...
    • 为获取类似对象添加了新方法。
    • 一些方法名称的微小变化。
  • 2014/02/11 (v1.0.0):新增方法。一些方法名称的微小变化。
  • 2014/02/11 (v0.0.2):改进文档。
  • 2014/02/10 (v0.0.1):首次发布。

许可证

版权所有(c)2014 Colas Bardavid

本许可证授予任何获得此软件及其相关文档文件副本(“软件”)的个人以免费方式在不进行任何限制的情况下处理软件,包括但不限于以下权利:使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本,并允许提供软件的个人以同样的方式行事,但需遵守以下条件

上述版权声明和本许可证声明应包含在软件的副本或实质性部分中。

本软件按“原样”提供,不提供任何明示或隐含的保证,包括但不限于对适销性、适用特定目的和侵权性的保证。在任何情况下,作者或版权所有者对于因软件本身、使用或以其他方式与软件相关的任何索赔、损害或其他责任,均不承担任何责任,不论是由于合同、侵权或其他行为产生。