2009-08-25 2 views
0

У меня установлена ​​базовая модель данных с двумя объектами в отношениях один-ко-многим (элементы и для каждого элемента могут быть несколько Сброс). Я уверен, что модель настроена правильно.Проблемы с базовыми датами данных

Я могу добавить новые элементы, и при этом добавьте новый 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), вы получаете NSSet, которые содержат Reset управляемые объекты в свою очередь, не NSDate объекты, что вы хотите, это 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

Ahhhhh, ладно, ладно. Это значительно больше смысла - это объект «Сброс», а не «NSDate». Одна проблема: 'resetDate' является' @ свойством' класса 'Reset', а не методом. Я не очень хорошо разбираюсь в синтаксисе этих вещей ... try [[sortedResets lastObject] .resetDate] ', но это явно не то, что я ищу ... – Triz

+0

@Triz с' resetDate' объявляется как свойство @, ваш объект Reset * будет * иметь методы 'resetDate' и' setResetDate: '. В этом весь смысл синтаксиса '@ property'. –

+0

@ Дэйв: Хорошо, хорошо. Я получаю предупреждение на этой строке, однако, что метод 'resetDate' не объявлен.Я получил его в заголовке класса «Сброс», как «@property (nonatomic, сохранить) NSDate * resetDate;», а в реализации - «@dynamic resetDate;». Должно ли это быть '@ синтезировать' вместо' @ dynamic'? Последнее, как я начал с шаблона CoreData, я делал, поэтому я сохранил его. – Triz

1

Может заменить:

NSDate *oldDate = sortedResets[0]; 

с:

NSDate *oldDate = [sortedResets objectAtIndex:0]; 

поможет. sortedResets является объектом NSArray, а не массив C;)

+0

Я также рекомендую заменить 'initWithOb jects: count: 'для создания массива sortDescriptors с более простым методом initWithObject:. –

+0

Dave: Это ('NSArray * sortDescriptors = [[NSArray alloc] initWithObject: sortDescriptor];') не работает - я что-то упустил? – Triz

+0

Брайан: Спасибо за это, я иногда забываю, что я больше не в С :) Я думаю, что это меня очень близко, но теперь я получаю сбои при создании нового Предмета, и это получается для отображения вновь созданной строки, но пока ничего нет в индексе 0. Я думал, что 'if() {}', вставленный выше, должен помочь, но он все еще умирает. Есть идеи? – Triz

Смежные вопросы