天道酬勤,学无止境

Deleting Relationship Objects with Cascade in Core Data

I'm looking to perform some simple deletion with Core data but just need a bit of advice on this one please.

I have a model with Transaction, Name, Event and Date Entities. The Transaction has a link to each of the other Entities.

In the app, when a user adds in information to text fields, that gets saved to a 4 tab table view controller.

The first tab is using NSFetchedResultController with a fetchRequest on the Transaction Entity. The second tab is using the Name Entity, the third is using the Event and the fourth is using the Date Entity.

If I delete an entry from the Transaction tab, it deletes just that transaction which makes sense.

What I want is to be able to delete a person from the Name tab, or an event from the Event tab and have that cascading through the model of the app. So if Bob has multiple transactions, deleting him the transaction tab will delete that one transaction.

If I delete BOB from the name tab, it should deleting him from every event that he was part off with every date and Transaction.

The same applies for the events and dates.

EDIT: Update to include data model

Note: Year Entity is experimental and currently not being used enter image description here How would I go about doing something like this?

Thanks

评论

If you set the "Deletion Rule" for the "transactions" relationship from Person to Transaction to "Cascade", then deleting a person will automatically delete all related transactions.

First, I cannot see the wisdom of abstracting dates into entities. Maybe you can enlighten me. In my mind, the date belongs to the transaction. On the date tab you still have to fetch transactions but present them grouped and sorted differently.

I suppose you know how to make your Person-to-Transactions relationships cascade. This will remove all transactions associated with a person. The same applies to Event.

Cascading in the other direction, however is more problematic. You have to somehow check if it is the last member of the to-many relationship and only delete it if it is. One way to do that is to override the setters. In your generated NSManagedObject subclasses you will find the auto generated setters, including those for adding or removing objects from sets (i.e., to-many relationships).

-(void)removeTransactionsObject:(Transaction *)value {
    [super removeTransactionsObject:value];
    if (!self.transactions.count) {
       [self.managedObjectContext deleteObject:self];
    }
}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Core Data NSBatchDeleteRequest appears to leave objects in context
    I have seen many questions regarding batch deletion in Core Data, but none seem to address my issue. I am creating an iOS 9 / Swift app using Core Data. At WWDC this year, I attended the Core Data session and saw that I could use NSBatchDeleteRequest to delete large numbers of objects directly from the persistent store. This works for me for some objects but not others, and I think it has something to do with my relationships. I have an object graph consisting of Subject and Course, where there is a one-to-many relationship. Subjects may own as many courses as they wish. There is a 'courses'
  • 核心数据 NSBatchDeleteRequest 似乎将对象留在上下文中(Core Data NSBatchDeleteRequest appears to leave objects in context)
    问题 我在 Core Data 中看到了很多关于批量删除的问题,但似乎没有一个能解决我的问题。 我正在使用 Core Data 创建一个 iOS 9 / Swift 应用程序。 今年在 WWDC,我参加了 Core Data 会议,看到我可以使用NSBatchDeleteRequest直接从持久存储中删除大量对象。 这对我适用于某些对象而不是其他对象,我认为这与我的人际关系有关。 我有一个由Subject和Course组成的对象图,其中存在一对多关系。 科目可以拥有任意数量的课程。 删除规则为Cascade Subject上存在“课程”关系,因为我希望在删除subject时删除与该subject相关的所有课程。 Course上的逆是“主题”,删除规则为Nullify 。 在这里,我对 Apple 对Nullify的描述有点困惑: 删除对象之间的关系,但不要删除任何一个对象。 只有当员工的部门关系是可选的,或者如果您确保在下一次保存操作之前为每个员工设置一个新部门时,这才有意义。 这很清楚,但为什么要删除关系而不删除任何一个对象? 如果我删除Course ,我希望删除Course并删除从subject到course的关系,以便删除的Course的错误不会出现在Subject courses集的NSSet 。 我想提供一种删除实体中所有对象的方法。
  • 使用EF Core进行级联删除(Cascade deleting with EF Core)
    问题 我目前在EF Core中遇到一些问题。 我有一些需要删除的数据,我正努力查看fluent API的工作原理,确切地说是关于.OnDelete()函数。 考虑到微软自己网站上的经典博客/帖子场景,我想知道到底是哪个实体,“ OnDelete()是“目标”(由于缺少更好的用词),在某些情况下,它似乎是博客,在其他情况下,则是帖子。 如果可以的话,是否可以从两侧定义级联删除(当父Blog为Blog时删除帖子),如果我想象代码应该像这样: model.Entity<Post>().HasOne(p => p.Blog).WithMany(b => b.Posts).HasForeignKey(p => p.BlogId).OnDelete(DeleteBehavior.Cascade) 据我了解,这是说“删除博客时,请先删除所有引用此博客的帖子”,这意味着OnDelete(DeleteBehavior.Cascade)适用于博客,而不适用于帖子。 但是,这是一样的吗? model.Entity<Blog>().HasMany(b => b.Posts).WithOne(p => p.Blog).OnDelete(DeleteBehavior.Cascade) 还是OnDelete(DeleteBehavior.Cascade)适用于Post而非博客? 回答1
  • 如何从关系中删除子对象或父对象?(How to delete Child or Parent objects from Relationship?)
    问题 我做了一个有更多关系的小应用程序。 现在我想删除我的表的详细信息如何删除我没有任何删除的想法。 关系如下: PanCard-->员工(Ono To One) Employee-->ProjectManger(到Employee的双向多对一关联) 项目 --> ProjectManager(项目的双向多对一关联) 现在我想一一删除表数据的数据 下面是我的 POJO 类代码: 卡片 @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="id") private int id; @Column(name="pName") private String pName; @Column(name="pNumber") private int pNumber; @OneToOne(cascade=CascadeType.ALL,fetch=FetchType.EAGER) @JoinColumn(name="EId") private Employee employee; 雇员.java @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name = "id") private int id; @Column(name =
  • 当我的关系删除规则设置为Nullify时,反向关系也会被删除吗?(When my relationship delete rule is set to Nullify, will the inverse relationship also be deleted?)
    问题 示例:我有一个部门和一个雇员。 部门与许多员工的关系为零,而员工与一个部门的关系则为反关系。 现在,我删除与Employee的关系。 因此,可以说市场部不再链接到乔·史蒂文斯。 1)乔·史蒂文斯(Joe Stevens)要求市场营销部门时,他仍然链接到市场营销部门吗? 还是Core Data会自动处理此问题并“无效化”呢? 2)在员工方面指定哪个删除规则有关系吗? 假设是Cascade。 部门删除了与员工的关系。 我相信在这种情况下Employee的删除规则不相关,对吗? 回答1 删除规则控制在删除拥有规则本身的对象时,关系另一端的对象发生什么情况。 所以: A<-(cascade)->>B B<<-(nullify)->A 删除 A 会导致删除所有相关的 B。 然而,删除任何一个 B 只会导致 A 忘记那个特定的 B。 因此,删除规则始终与目标对象相关,因为目标对象是删除规则的整个要点。 当对象具有多个关系时尤其如此。 A<-(cascade)->>B B<<-(nullify)->A C<--(cascade,required)-->>B 无论 A 想要什么,C 对象都会阻止对它也持有的任何 B 对象的级联删除。 (在这种情况下,A 将无效。) 您不应该根据实际编程来考虑删除规则,而应该根据您尝试建模的真实世界系统来考虑。 想想真实系统的关系,然后设置删除规则来模仿它们。
  • Core Data Nullify 规则何时更新关系?(When does Core Data Nullify rule update relations?)
    问题 我拥有和想要的: 我有一个一对多的关系 A <--->> B (对多部分是有序的)。 当删除 A 时,所有与 A 有关系的 B 也应该被删除,因此 A 与 B 的关系的删除规则设置为级联-> 工作正常删除 B 时,只应清除与 A 的关系,因此 B 与 A 的关系的删除规则设置为无效-> 不起作用(仅在延迟后) 问题描述: 因此,我遇到了与此问题“核心数据无效规则不起作用?”中所述完全相同的问题:我删除了与 A 有关系的 B,然后立即计算剩余 B 的数量,即 A有关系,和之前一样。 该问题中公认的答案是使用级联而不是 nullify,因为 nullify 的作用是: 当对象被删除时,Nullify 将指针设置为 null。 如果你有一个指针数组,它不会删除它,它只是将它设置为空。 我看到这个答案有两个问题: 我很确定在这种情况下级联是错误的规则,因为它在删除 B 时也会删除 A,这不是我想要实现的。 (不过我还是尝试了,结果正如我所料:A 也被删除了)。 集合不能将 null 作为其元素之一,除非使用 NSNull 单例。 所以我怀疑这就是无效规则的作用。 经过一番试验,我发现,如果我删除 B 的一个实例,它会立即被删除,但与 A 的关系不会立即清除,而是会在一点延迟后清除: // Method is called by pressing a button -(void
  • 核心数据:删除实体类型的所有对象,即清除表(Core Data: delete all objects of an entity type, ie clear a table)
    问题 之前曾有人问过这个问题,但是没有解决方案能够满足我的应用需求。 在我们设置的通信协议中,每次执行同步时,服务器都会发送一组新的所有客户。 之前,我们一直以plist的形式存储。 现在想使用核心数据。 可能有成千上万的条目。 单独删除每一个都需要很长时间。 有没有一种方法可以删除Core Data中特定表中的所有行? delete from customer sqlite中的此调用会立即发生。 在iPad1上,在Core Data中逐一逐一检查可能需要30秒钟。 关闭Core Data是否合理,即删除持久性存储和所有托管对象上下文,然后放入sqlite并对表执行delete命令? 在此过程中,没有其他活动在进行,因此我不需要访问数据库的其他部分。 回答1 戴夫·德隆(Dave DeLong)是几乎所有方面的专家,所以我觉得我在告诉耶稣如何在水上行走。 诚然,他的帖子来自很久以前的2009年。 但是,Bot发布的链接中的方法不一定是处理大型删除的最佳方法。 基本上,该文章建议获取对象ID,然后遍历它们,并在每个对象上调用delete。 问题在于,当您删除单个对象时,它也必须处理所有关联的关系,这可能会导致进一步的提取。 因此,如果您必须像这样进行大规模删除,建议您调整整个数据库,以便可以隔离特定核心数据存储中的表。 这样,您可以删除整个存储,并可能重新构造您想保留的小部分。
  • 每个核心数据关系都必须具有逆关系吗?(Does every Core Data Relationship have to have an Inverse?)
    问题 假设我有两个实体类别: SocialApp和SocialAppType 在SocialApp我有一个属性: appURL和一个关系: type 。 在SocialAppType我具有三个属性: baseURL , name和favicon 。 所述的目的地SocialApp关系type是在一个单一的记录SocialAppType 。 例如,对于多个Flickr帐户,将有许多SocialApp记录,每个记录都包含一个人的帐户的链接。 对于“ Flickr”类型,将有一个SocialAppType记录,所有SocialApp记录都将指向该记录。 当我使用此架构构建应用程序时,会收到一条警告,指出SocialAppType和SocialApp之间没有反向关系。 /Users/username/Developer/objc/TestApp/TestApp.xcdatamodel:SocialApp.type: warning: SocialApp.type -- relationship does not have an inverse 我需要逆吗,为什么? 回答1 实际上,我没有因没有逆而导致任何数据丢失-至少我知道。 快速的Google建议您使用它们: 逆向关系不仅使事情变得更整洁,而且实际上是Core Data用来维护数据完整性的。 -可可开发中心 通常
  • 如何在NHibernate中删除子对象?(How to delete child object in NHibernate?)
    问题 我有一个父对象,它与子对象的IList具有一对多的关系。 删除子对象的最佳方法是什么? 我不是要删除父母。 我的父对象包含一个子对象的IList。 这是一对多关系的映射: <bag name="Tiers" cascade="all"> <key column="mismatch_id_no" /> <one-to-many class="TGR_BL.PromoTier,TGR_BL"/> </bag> 如果我尝试使用clear()从集合中删除所有对象,然后调用SaveOrUpdate(),则会出现此异常: System.Data.SqlClient.SqlException: Cannot insert the value NULL into column 如果我尝试分别删除子对象,然后将它们从父对象中删除,则会出现异常: deleted object would be re-saved by cascade 这是我第一次处理在NHibernate中删除子对象。 我究竟做错了什么? 编辑:只是为了澄清-我不是要删除父对象,只是子对象。 我与父母建立了一对多的关系。 我还需要在子对象映射上创建多对一关系吗? 回答1 之所以会出现第一个错误,是因为从集合中删除项目时,NHibernate的默认操作模式是简单地断开关联。 在数据库中
  • 如何使用不将删除级联到其子级的ForeignKeys创建Django模型?(How do I create a Django model with ForeignKeys which does not cascade deletes to its children?)
    问题 我的一个带有ForeignKey的模型实际上是其他表上的MySQL视图。 我遇到的问题是,当我从这些表中删除数据时,Django,如“删除对象”文档中所述... Django删除对象时,它会模拟DELETE CASCADE上SQL约束的行为-换句话说,任何具有外键指向要删除对象的对象都将被删除。 ...尝试从我的视图中删除行,当然不能删除行,因此引发错误: mysql_exceptions.OperationalError '>=(1395, "Can not delete from join view 'my_db.my_mysql_view'"' 有什么方法可以在模型上指定ForeignKey约束,该约束将为我提供所有Django向导,但不会在其上级联删除? 或者,是否有一种方法可以要求MySQL忽略从我的视图中删除行而不是引发错误的命令? 回答1 哈罗德的回答为我指明了正确的方向。 这是我实现它的方式的草图(在法国旧式数据库上,因此命名约定有些奇怪): class Factures(models.Model): idFacture = models.IntegerField(primary_key=True) idLettrage = models.ForeignKey('Lettrage', db_column='idLettrage', null=True
  • 核心数据删除规则和多对多关系(Core Data Deletion rules and many-to-many relationships)
    问题 假设您有部门和员工,并且每个部门都有多个员工,但是每个员工也可以是多个部门的一部分。 因此,员工与部门之间存在多对多关系。 删除部门时,我要删除仅属于该部门的所有员工,并取消对同时也是另一个部门成员的所有员工与该部门的关系。 双向的级联规则会这样做吗? 还是级联规则会自动删除部门的所有员工,而与其他从属关系无关? 回答1 级联规则将自动删除目标位置上的对象。 因此,如果删除部门,则无论员工所在部门的数量如何,都将删除员工。 听起来您想要的行为有些细微差别,仅删除“孤立的”员工,即没有部门的员工。 删除部门时,找到这些部门的一个好方法是执行以下操作: NSManagedObject *doomedDepartment = // get the department to be deleted NSSet *employees = [doomedDepartment valueForKey:@"employees"]; NSSet *orphanedEmployees = [employees filteredSetUsingPredicate:[NSPredicate predicateWithFormat:@"departments.@count == 1"]]; for (NSManagedObject *orphanedEmployee in
  • 如何正确地级联删除Core Data中的托管对象?(How to properly cascade delete managed objects in Core Data?)
    问题 我有一个核心数据模型,该模型具有三个实体:A,B和C。A与B具有一对多的关系,而B与C具有多对多的关系。A的删除规则-> B是“级联”,而B-> A是“无动作”。 B-> C的删除规则为“无操作”,而C-> B的删除规则为“拒绝”。 我无法在A实体上执行删除操作。 我想发生的事情如下: 我删除A的实例(使用deleteObject: 删除会传播到与A关联的任何B(由于“级联”删除规则) 与A关联的所有B均被删除属于关联B已删除的C的所有关系也将被删除 这可能有点令人困惑,所以让我解释一下:删除A时,删除所有关联的B。 并且任何引用那些B的C都不能再引用它们。 在测试中,我根本看不到“级联”删除规则对我有用。 删除A时,此后立即调用processPendingChanges (只是为了确保删除已完成)。 然后,我比较删除前后的NSManagedObjectContext中A和B的数量。 A的实例已正确删除(现在A的总数比删除前少了一个)。 但是,B的数目保持不变。 因此,似乎不遵循“级联”删除规则。 我知道我可以手动处理A-> B关系,并手动删除每个B。但是,这似乎是Core Data免费提供的,因此,除非Core Data不足,否则我不想这样做。 欢迎提供有关使用“级联”删除规则的任何信息。 回答1 我当然不是Core Data的专家,但是在阅读有关各种删除规则选项的文档时
  • How to delete Child or Parent objects from Relationship?
    I did a small application with more relationships. Now I want to delete details of my table how can I delete I don't get any Idea to delete. Relationships are like below: PanCard-->Employee (Ono To One) Employee-->ProjectManger (bi-directional many-to-one association to Employee) Projects -->ProjectManager(bi-directional many-to-one association to Projects) Now I want delete the data of one by one table data Below is my POJO classes Code: PanCard.java @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="id") private int id; @Column(name="pName") private String pName; @Column
  • Using Cascade Delete Rule and validateForDelete on a One-to-Many Relationship in iPhone Core Data
    Preface: I have two entities defined as a one-to-many relationship: A <<-------> B. B's relationship to A is called myAs and is a to-many relationship with Nullify as the Delete Rule. The inverse relationship from A to B is a to-one relationship with Cascade as the Delete Rule. I have implemented validateForDelete on the B class like so: - (BOOL)validateForDelete:(NSError **)error { [super validateForDelete:error]; BOOL validDelete = FALSE; if ([self.myAs count] == 0) { validDelete = TRUE; } return validDelete; } The purpose of this is to delete the object B only if there are no more A objects
  • 在iPhone核心数据中的一对多关系上使用级联删除规则和validateForDelete(Using Cascade Delete Rule and validateForDelete on a One-to-Many Relationship in iPhone Core Data)
    问题 前言: 我有两个定义为一对多关系的实体:A << ------->B。B与A的关系称为myAs,并且是一个以Nullify作为删除规则的一对多关系。 从A到B的逆关系是级联作为删除规则的一对一关系。 我已经在B类上实现了validateForDelete,如下所示: - (BOOL)validateForDelete:(NSError **)error { [super validateForDelete:error]; BOOL validDelete = FALSE; if ([self.myAs count] == 0) { validDelete = TRUE; } return validDelete; } 这样做的目的是仅在与对象B之间没有关联的A对象时删除该对象B(但是,如果与它之间没有任何A对象,则始终删除该B对象)。 如果我在保存之前在B对象删除上手动检查此验证,则validateForDelete会按预期工作: if ([b validateForDelete:NULL]) { //delete b object... [context save:&error]; ... } 我遇到的问题是从A对象删除中级联删除B对象时。 用户将无法直接访问B对象-它们是通过A对象创建和删除的。 因此,我的规则是:当不再有与之关联的A对象时,必须从A对象中强制删除B对象
  • How to properly cascade delete managed objects in Core Data?
    I have a Core Data model which has three entities: A, B, and C. A has a one-to-many relationship with B, and B has a many-to-many relationship with C. The delete rule for A -> B is "Cascade", and B -> A is "No Action". The delete rule for B -> C is "No Action", and C -> B is "Deny". I am having trouble performing a delete on the A entity. What I want to happen is the following: I delete an instance of A (using deleteObject:) The delete propagates to any B's associated with A (due to the "Cascade" delete rule) All B's associated with A are deleted Any relationships belonging to C's whose
  • Deleting all table records from core data database using relationship
    I'm using core data for my application i have 4-5 tables one of which is userProfile table. i have implemented logout in the app. if user logs out of the app im deleting user profile and will be inserting new if logged in with other user account. i want to delete all the records from database on userprofile delete. im using relationship for this but it is not deleting other records from the db even if user profile record has been deleted. one thing i would like to mention is all the data is coming from service. and i am using cascade delete rule for relationship created between userprofile
  • When does Core Data Nullify rule update relations?
    What I have and want: I have a one-to-many relationship A <--->> B (the to-many part is ordered). When deleting A all B's with a relation to A should be deleted as well, so the deletion rule for A's relation to B is set to cascade -> Works fine When deleting B only the relationship back to A should be cleared, so the deletion rule for B's relation to A is set to nullify -> Doesn't work (only after a delay) Description of the problem: So I have the exact same problem as stated in this question "Core Data Nullify rule doesn't work?": I delete a B that has a relation to an A and immediately after
  • NHibernate Definitive Cascade 应用指南(NHibernate Definitive Cascade application guide)
    问题 是否有任何互联网资源对 NHibernate 的所有级联设置有明确的指南,其中将包括类结构示例、HBM 以及每个级联设置对与 NH 的所有关系的操作的影响。 如果有以最正确的方式完成常见关联的示例,例如设置一个状态表,您将永远不会以级联删除状态,或者删除具有 CreatedBy User 属性的对象,这也会很有帮助永远不会以级联方式删除用户等。 回答1 以下内容改编自 Java Hibernate 参考 http://docs.jboss.org/hibernate/stable/core/manual/en-US/html/objectstate.html#objectstate-transitive for NHiberate 3.0(即当前的 svn 主干) . 对于 NHibernate Session 的每个基本操作——包括 Persist()、Merge()、SaveOrUpdate()、Delete()、Lock()、Refresh()、Evict()、Replicate()——都有相应的级联样式。 级联样式分别命名为persist、merge、save-update、delete、lock、refresh、evict、replicate。 Save() 和 Update() 的级联样式是 save-update; 对于 SaveAndUpdateCopy()
  • 使用实体框架和System.Data.SQLite进行级联删除的问题(Problem with cascade delete using Entity Framework and System.Data.SQLite)
    问题 我有一个已建立的SQLite数据库,因此当我删除一个Person时,该删除是级联的。 当我手动删除一个Person时,此方法工作正常(所有引用PersonID的记录都被删除了)。 但是,当我使用实体框架删除Person时,出现错误: System.InvalidOperationException: The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted. 我不明白为什么会这样。