使用 CBDCoreDataToolKit,您可以克隆、替换或导入您的 NSManagedObject。克隆在您想将新数据从 NSManagedObjectContext(一个 MOC
)传输到另一个时很有用。导入是指当您想将某些数据“集成”到一个代码 MOC
到另一个 MOC
中时。通过集成,我指的是要导入的数据 并不 完全是新的。也许只是实体之间存在新的链接,或者可能只是一个具有许多与 现有 对象关系的实体的新实例。
在这种情况下需要理解的是
克隆将“拖”起新对象连接的整个图,我们将有许多重复的。
导入更聪明(但也更难)并将“拖”起新对象连接的整个图 以及 与现有图合并。 超级棒!
您想从一个 MOC
复制一个对象(以及 与其相关的所有图)到另一个。 CBDCoreDataToolKit 可以做到这一点。它还将复制与第一个对象有关联的对象(以及递归),但您可以指定要忽略的实体或属性。
假设您有一个包含许多相互关联的对象的图。您想用另一个对象替换该图中的对象,并且当然,您希望图保持不变。 CBDCoreDataToolKit 可以做到这一点。当您不必询问有关 MOC
的问题时:您可以取任何 NSManagedObject
并用另一个替换它。
这与克隆有些类似,但它更强大。虽然克隆是从 sourceMOC
将对象的所有图形(除了您可以剪除的部分)拉到 targetMOC
,但导入功能更聪明。
要导入一些数据,很简单!
首先,您需要创建一个 CBDCoreDataImporter
的实例。您这样做:
CBDCoreDataImporter * myImporter;
myImporter = [CBDCoreDataImporter alloc] initWithSourceMOC:sourceMOC
targetMOC:targetMOC];
然后,为了导入
[myDataImporter import:object];
它将导入object
到targetMOC
中,并将其包含在targetMOC
中现有对象图形中。为此,CBDCoreDataImporter需要对sourceMOC
和targetMOC
中的对象进行比较。这是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] ;
但是,你可能想要非常精确地定义你想要在哪些属性和关系上执行所有这些操作:区分以及导入。这是可能的,并且它使用了CBDCoreDataDecisionCenter
和CBDCoreDataDecisionUnit
。
Nested code snippet唠叨解释
根据载人关系决策:在实体Person
的情况下,仅考虑属性name
、age
和关系family
来做出决策。(在这里,决策即是“告诉我他们是否相似”或“复制此实体”,但你可以想象其他情况)。
在实体Car
的情况下,不要考虑(我的意思是:永远不要)关系owners
来做决策。
忽略实体Bike
。
等等。
最佳做法是查阅文档以了解更多关于代码的信息。
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]
使用CoreData时,当你想获取信息时,它既复杂又重复。CBDCoreDataToolKit为你提供了便利的方法,以便快速达成目标。这些方法接受格式字符串,因此更具便利性。许多其他库也这样做,包括非常知名的马吉克记录(Magical Record)。不幸的是,马吉克记录不能与NSPersistentDocument
一起工作。CBDCoreDataToolKit可以。
在Apple类中定义的所有方法都以_cbd_
结尾,以避免名称冲突。
如果它们实现了类方法+ (NSString *)entityName
或者它们的名字与相应的实体相同,则可以在NSManagedObject
的子类上执行获取操作。这是由mogenerator
生成的类的例子。
您将能够进行如下操作
[Person findInMOC:self.myMOC
orderedBy:@"name, age"
withPredicateFormat_cbd_:@"city == %@", theCity] ;
TODO
TODO
TODO
在NSManagedObject+CBDActiveRecord
类别中的某些方法需要满足以下条件之一
mogenerator
生成了NSManagedObject
的子类。Entity
的NSManagedObject
子类也被命名为Entity
。但是请不要担心,这个要求(实际上总是满足的)已经被限制在这个类别内。本库的其他部分不需要这个要求。
类和方法的文档可在此处找到。
要运行示例项目,请先从Example目录中克隆仓库,然后运行pod install
。
Colas,[email protected]
VPPCoreData
包StackOverflow
-clone...
方法新增了@return
:现在它返回一个映射旧对象到新对象的字典CBDCoreDataDecisionUnit
添加了便捷的初始化器MOC
之间查找重复项的方法- removeLastHint
、removeLastEntryOfTheCache
方法ConnectedEntities
子库。allObject_cbd_
和countAllObjects_cbd_
上的错误:它是多次计数的(当一个实体有子实体时)MOC
到另一个MOC
的更高级的导入器。通过它们的图如身份进行比较...版权所有(c)2014 Colas Bardavid
本许可证授予任何获得此软件及其相关文档文件副本(“软件”)的个人以免费方式在不进行任何限制的情况下处理软件,包括但不限于以下权利:使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本,并允许提供软件的个人以同样的方式行事,但需遵守以下条件
上述版权声明和本许可证声明应包含在软件的副本或实质性部分中。
本软件按“原样”提供,不提供任何明示或隐含的保证,包括但不限于对适销性、适用特定目的和侵权性的保证。在任何情况下,作者或版权所有者对于因软件本身、使用或以其他方式与软件相关的任何索赔、损害或其他责任,均不承担任何责任,不论是由于合同、侵权或其他行为产生。