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