1

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

在我下面的例子中,我有实体帐户与实体交易日期的多对多关系。我正在考虑,因为在一个帐户下会有多个日期。

在哪里我感到困惑的是,我只想有一个具体的日期......意思是,只有一个日期,没有重复。然后意图使实体交易日期与实体事件具有多对多关系。因此账户XYZ将有2012年6月11日的转账日期和实体事件的多个条目。然后账户XYZ将具有2012年6月12日的转换日期和实体事件的多个条目。

账户与转账日期之间的关系是真正的一对多还是一对一? 如果它是一对多......如何处理重复项?如何在实体Trans日期中只保留一个日期?如果我的代码通过条目添加到Event和Trans Date中,是否在那里完成了一些处理?怎么样?

我猜账户转换日期应该是一个......但在这一点上确实不确定。

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

回答

0

为了建立一个事务注册的模型,我建议使addDate成为Event的一个属性并且完全删除交易日期。

它极大地简化了管理对象图所需的工作,并消除了重复日期的需要。

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

+0

太好了!为什么我做交易日期的原因是为了能够将日期分段放在表格视图中。思考我可以从实体交易日期获取对象计数来设置nubmerOfSectionsInTableView。这可能与distinctUnionOfSets? – BlizzofOZ

+0

由于您也需要表视图的值,因此只需在结果NSSet上调用count即可获得计数。但是,是的,如果需要,可以使用'@ count.addDate'单独执行计数。 – paulmelnikow

+0

好点...我很抱歉,因为我对此很新。在某种程度上,我想知道我的示例如何工作,但我认为将addDate移动到Event可以让它更简单,就像您所说的那样。我本来就是这样做的,但是,我认为我必须这样做才能让表格视图中的标题部分计数。每一步都是一次学习体验! – BlizzofOZ

1

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

首先

如果Account只能有一个Transaction Date,我想你应该设置一比一的关系。通过这种方式,您可以确定有一个AccountTransaction Date,反之亦然。在核心数据后面,核心数据将设置你的数据库,这样你的Account表就会有一个相应的对象ID的字段。

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

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

一般当我需要重复检查,我使用GUID作为一个实体(例如,全局唯一标识符NSString类型)的属性。所以,在你的Transaction Date你可以使用这样的机制。然后,你可以设定类似以下的谓词获取请求:

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

每次插入新Transaction Date你可以生成基于日期(无时间)一个新的GUID和特定Account(使用自己的协议做到这一点)。

考虑一下,你也可以保存并检查日期而不用其时间部分(category-on-nsdate)。我认为它会工作,但你需要尝试。通过这个方法,你可以简单地使用谓词而不需要guid。例如:

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

希望它有帮助。

+0

考虑支票簿注册...在银行xxxx(帐户)下,于2012年6月11日(跨日期),我有很多条目(活动)。然后帐户xxxx,在日期06/12/2012我有更多的条目。我尝试了帐户与交易日期之间的一对一关系,但是当我添加两个或更多事件时,我检查了反对日期的fetchrequest计数,并且它不止一个。我只想在2012年11月6日的物体上使用。对不好的描述抱歉。我可能不会完全包装我的头,这是如何工作的。 – BlizzofOZ

+0

您需要按照第二种方式(我有一个编辑来区分两种不同的解决方案)进行手动检查。另外,你可以提供你用来添加事件的代码,也许我可以帮你。 –

+0

不,不......我只需要一个验证和一个正确的方向。我真的很感激这个长长的答案,我理解你正在展示的概念。我是一位老语言的程序员,并且知道键控数据库,但我不确定我是否理解了Core Data的工作原理。如果我卡住了,我会再回来的! – BlizzofOZ