1

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

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

我感到困惑的是,我只想有一个特定的日期......意思是,只有一个日期,没有重复。然后,意图是使实体交易日期与实体事件具有一对多关系。因此帐户 XYZ 将具有 06/11/2012 的交易日期和实体事件的多个条目。然后帐户 XYZ 将具有 06/12/2012 的交易日期和实体事件的多个条目。

Account 和 Trans Date 之间的关系真的是一对多还是一对一?如果是一对多...如何处理重复项?如何在实体 Trans Date 中只保留一个日期?如果我的代码通过条目添加到事件和交易日期中,是否在那里进行了一些处理?如何?

我猜账户到交易日期应该是一对一……但现在真的不确定。

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

2 回答 2

1

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

第一的

如果一个Account可以只有一个Transaction Date,我认为你应该设置一个一对一的关系。通过这种方式,您可以确定一个人Account有一个Transaction Date,反之亦然。在后面,Core Data 会设置你的数据库,这样你的Account表就会有一个对应Transaction Date对象 ID 的字段。

第二

如果您正在设置结帐机制并且Account可以进行多笔交易(例如,每天只有一笔),您需要设置一对多的关系。如果您需要每天检查单笔交易,则需要手动执行检查。Transaction Date使用特定日期的谓词设置请求,Account并查看计数是否大于一。如果没有,请添加Transaction Date.

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

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

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

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

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

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

希望能帮助到你。

于 2012-06-11T21:58:17.327 回答
0

为了对事务寄存器进行建模,我建议将 addDate 设为 Event 的属性并完全删除 Transaction Date。

它显着简化了管理对象图所需的工作,并消除了对日期进行重复数据删除的需要。

如果您需要生成唯一日期列表,您可以使用 distinctUnionOfSets 即时执行此问题的答案: CoreData get distinct values of Attribute

于 2012-06-12T17:55:38.853 回答