2009-08-25 48 views
0

我已經設置了一個Core Data模型,其中兩個實體處於一對多關係(Items,對於每個項目,可以有多個ResetDates)。我很確定模型設置正確。核心數據日期的問題

我可以添加新的項目,當這樣做時,添加一個新的ResetDate(使用當前日期,[NSDate date])。我可以檢索並顯示項目。我遇到的麻煩是檢索並顯示ResetDates。

更新:它現在的作品,非常感謝下面的答覆者。這裏是有問題的代碼:

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"resetDate" ascending:NO]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:&sortDescriptor count:1]; 

NSMutableArray *sortedResets = [[NSMutableArray alloc] initWithArray:[item.resets allObjects]]; 
[sortedResets sortUsingDescriptors:sortDescriptors]; 

NSDate *oldDate = [[sortedResets lastObject] resetDate]; 
if (!oldDate) { 
    oldDate = [NSDate date]; 
} 

NSInteger numberOfDays = [self timeIntervalWithStartDate:oldDate withEndDate:currentDate]; // This function works fine, when given two NSDate objects 

daysSinceLabel.text = [NSString stringWithFormat:@"%d days", numberOfDays]; 

回答

3

首先,NSArray -objectAtIndex:沒有返回nil如果你傳遞一個索引超出界限的,它會引發NSRangeException,當你不知道的索引,並且需要使用-objectAtIndex:,則必須先調用-count方法進行檢查。

更重要的是,NSArray不能包含nil值,因爲nil不是對象。

然後,不,它不是一個NSDate對象,當你問item爲它的復位關係(item.resets),你得到的是包含在返回Reset管理的對象,而不是NSDate對象的NSSet,你想要的是的resetDate屬性返回Reset管理的對象,也許是這樣的:

// NSArray -lastObject method return nil if the array is empty 
// Sending messages to nil is Ok there, so we can call resetDate directly 

NSDate *oldDate = [[sortedResets lastObject] resetDate]; 
if (!oldDate) { 
    oldDate = [NSDate date]; 
} 

。希望幫助,和我的英語是可以理解的......

+0

啊,好的,好的。這使得*現在更有意義 - 它是一個Reset對象,而不是一個NSDate。一個問題:'resetDate'是'Reset'類的'@ property',而不是一個方法。我對這些東西的語法還不是很好......嘗試過'[[sortedResets lastObject] .resetDate]',但這顯然不是我要找的東西...... – Triz 2009-08-26 18:24:05

+0

@Triz since'resetDate'被聲明爲一個@屬性,你的Reset對象將會有'resetDate'和'setResetDate:'方法。這是'@ property'語法的重點。 – 2009-08-26 18:53:26

+0

@Dave:對,好吧。但是,我在該行發出警告,說沒有聲明'resetDate'方法。我在'Reset'類的頭文件中使用了'@property(nonatomic,retain)NSDate * resetDate;',並在'@dynamic resetDate;'的實現中。它應該是'@ synthesize'而不是'@ dynamic'嗎?後者是我開始的CoreData模板是如何做的,所以我保留了它。 – Triz 2009-08-26 19:08:21

1

也許更換:

NSDate *oldDate = sortedResets[0]; 

有:

NSDate *oldDate = [sortedResets objectAtIndex:0]; 

會有所幫助。 sortedResets是一個NSArray對象,而不是C數組;)

+0

我也建議更換'initWithOb jects:count:'用簡單的'initWithObject:'方法創建sortDescriptors數組的方法。 – 2009-08-25 17:22:34

+0

Dave:這('NSArray * sortDescriptors = [[NSArray alloc] initWithObject:sortDescriptor];')不起作用 - 我錯過了什麼? – Triz 2009-08-25 18:55:36

+0

布賴恩:謝謝你,我有時忘了我不在C了:) 我認爲這讓我更加接近,但現在我得到崩潰時,正在創建一個新的項目,這得到調用以顯示新創建的行,但索引0處沒有任何內容。我認爲上面插入的'if(){}'應該有幫助,但它仍然會死。有任何想法嗎? – Triz 2009-08-25 18:57:41