2009-12-10 2 views
0

У меня есть приложение, которое читает rss-канал, анализирует xml и добавляет его в мою базу данных с использованием Core Data (это значит, что пользователь может видеть фид, даже если интернет-соединение недоступно), все это работает нормально. Я так делаю разбор: на didStartElement я создать новый объект, такие как:iPhone Core Данные, сохраняющие сразу несколько элементов случайного поведения?

NewsDB *newsDB = [NSEntityDescription insertNewObjectForEntityForName:@"NewsDB" inManagedObjectContext:managedObjectContext]; 
self.currentObject = newsDB; 

и в didendDocument я просто сохранить все с чем-то, такими как:

- (void)parserDidEndDocument:(NSXMLParser *)parser { 

NSError *error = nil; 

if (![managedObjectContext save:&error]) 
{ 
    NSLog(@"Error saving %@", error); 
} 

Это аль работ отлично, на самом деле моя программа работает именно так, как я хочу сейчас. Но мой вопрос заключается в том, когда контекст управляемого объекта получает сохраненные элементы, которые, как представляется, добавляются случайным образом, это первый созданный объект в контексте, возможно, не является первой строкой в ​​базе данных. Я исправил это, добавив столбец, который сообщает мне позицию в xml, а затем просто сортировку по этому столбцу в моем fetchedResultsController.

Я знаю, что могу просто сохранять контекст каждый раз, когда объект заканчивается, но это не похоже на хороший подход, поэтому я просто сохраняю их всех в конце.

Мой вопрос, почему они добавляются случайно ?, это нормальное поведение ?. Спасибо.

-Oscar

ответ

2

Валюта основных данных - NSSet* экземпляров. Наборы неупорядочены, поэтому все, что вы добавляете, а затем возвращаете обратно, вернется к вам без каких-либо внутренних заказов.

Так что вам просто нужно применить NSSortDescriptor, когда вы инициализируете свой NSFetchedResultsController. Вы можете применить столько сортировочных порядков, сколько хотите, например:

NSSortDescriptor *lastNameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"lastName" ascending:YES selector:@selector(caseInsensitiveCompare:)]; 
NSSortDescriptor *firstNameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES selector:nil]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:lastNameDescriptor, firstNameDescriptor, nil]; 
[fetchRequest setSortDescriptors:sortDescriptors]; 
[sortDescriptors release]; 
[lastNameDescriptor release]; 
[firstNameDescriptor release]; 

... 

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"keyInitial" cacheName:@"MyObjects"]; 
self.fetchedResultsController = aFetchedResultsController; 
self.fetchedResultsController.delegate = self; 
[aFetchedResultsController release]; 
[fetchRequest release]; 

NSError *error; 
if (![self.fetchedResultsController performFetch:&error]) { 
    // handle error... 
} 
0

Это нормальное поведение. Возможно, вы также заметили, что когда вы создаете отношение «ко многим», связанное свойство является неупорядоченной коллекцией (NSSet).

Когда дело касается заказа, просто добавьте атрибут number для сортировки, как вы это сделали.

+0

Спасибо, я не понимал, что это был NSSet. –

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