尝试理解核心数据关系或处理重复项

时间:2012-06-11 17:26:43

标签: objective-c core-data entity-relationship one-to-many one-to-one

我正在尝试验证我了解核心数据关系和/或可能如何处理重复项。

在下面的示例中,我将实体帐户与实体交易日期建立在多对多关系中。我想的很多,因为一个帐户下会有多个日期。

我感到困惑的是,我只希望有一个特定的日期...意思是,只有一个日期,没有重复。然后,目的是让实体Transaction Date与实体Event具有to-many关系。因此帐户XYZ将具有06/11/2012的转换日期以及实体事件的多个条目。然后,帐户XYZ将具有06/12/2012的转换日期以及实体事件的多个条目。

账户和转账日期之间的关系真的是多对多还是一对一? 如果它是一个多对......如何处理重复?如何在实体Trans Date中只保留一个日期?如果我的代码是按条目添加到事件和转换日期,那么是否进行了一些处理?怎么样?

我猜帐户到Trans Date应该是一个......但是现在还不确定。

/-----------------------\          /----------------------\       /------------------\
| Account               |          | Transaction Date     |       |   Event          |
|-----------------------|          |----------------------|       |------------------|
| name                  |          | addDate              |       |  amount          |
| balance               |          |                      |       |                  |
|-----------------------|          |----------------------|       |------------------|
| heldByAcct            | <-\      |                      |       |                  | 
|                       |     \->> | inAcct               |       |                  |
|                       |          | heldByEvent          |<-\    |                  |
\-----------------------/          \----------------------/   \->>| inTrans          |
                                                                  \------------------/

2 个答案:

答案 0 :(得分:1)

我不确定我是否理解你想要达到的目标,但我会尽力给你一些建议。

第一

如果Account只能有一个Transaction Date,我认为你应该建立一对一的关系。通过这种方式,您确信Account有一个Transaction Date,反之亦然。在后面,Core Data将设置您的数据库,以便您的Account表将包含相应Transaction Date对象的ID字段。

第二

如果您要设置结帐机制并且Account可以有多个交易(例如每天只有一个),则需要设置一对多关系。如果您需要每天检查一次交易,则需要手动执行检查。针对Transaction Date设置针对特定Account和日期的谓词的请求,并查看该计数是否大于1。如果不是,请添加Transaction Date

NSInteger count = [fetchRequest countForFetchRequest:&error]; // query against `Transaction Date`
if(count >= 1) // not allowed
else // allowed

通常当我需要检查重复项时,我使用guid作为实体的属性(例如类型为NSString的guid)。所以,在Transaction Date你可以使用这种机制。然后,您可以使用如下谓词设置获取请求:

[NSPredicate predicateWithFormat:@"guid == %@ AND inAcct == %@", @"12345", [self currentAccount]];

每次插入新Transaction Date时,您都可以根据日期(没有时间)和特定Account生成新的guid(使用您自己的协议来执行此操作)。

考虑到这一点,您还可以保存并检查日期而不包含其时间部分(category-on-nsdate)。我认为它会起作用,但你需要尝试。通过这种方式,您可以简单地使用没有guid的谓词。例如:

[NSPredicate predicateWithFormat:@"addDate == %@ AND inAcct == %@", [self currentDate], [self currentAccount]];

希望它有所帮助。

答案 1 :(得分:0)

要建模交易记录,我建议将addDate作为Event的属性并完全删除交易日期。

它显着简化了管理对象图所需的工作,并且无需重复删除日期。

如果您需要生成一个唯一日期列表,您可以使用distinctUnionOfSets动态执行此操作,如此问题的答案中所述: CoreData get distinct values of Attribute