2013-10-24 3 views
0

Я использую основные данные и NSManagedObject как объектную модель для временного хранения данных в приложении до его сохранения.NSFetchedResultsController - показывать результаты только в базе данных?

Затем в виде таблицы я показываю все сохраненные экземпляры. Однако временный объект также отображается в списке. Как я могу убедиться, что в моем табличном представлении отображаются только те результаты, которые фактически сохранены в базе данных?

- (NSFetchedResultsController *)fetchedResultsController 
{ 
    if (_fetchedResultsController != nil) { 
     return _fetchedResultsController; 
    } 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    // Edit the entity name as appropriate. 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"State" inManagedObjectContext:self.managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    // Set the batch size to a suitable number. 
    [fetchRequest setFetchBatchSize:20]; 

    // Edit the sort key as appropriate. 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:NO]; 
    NSArray *sortDescriptors = @[sortDescriptor]; 

    [fetchRequest setSortDescriptors:sortDescriptors]; 

    // Edit the section name key path and cache name if appropriate. 
    // nil for section name key path means "no sections". 
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Master"]; 
    aFetchedResultsController.delegate = self; 
    self.fetchedResultsController = aFetchedResultsController; 

    NSError *error = nil; 
    if (![self.fetchedResultsController performFetch:&error]) { 
     // Replace this implementation with code to handle the error appropriately. 
     // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 

    return _fetchedResultsController; 
} 

ответ

2

Вы можете установить

[fetchRequest setIncludesPendingChanges:NO]; 

Из документации :

Значение по умолчанию: YES.

Если значение NO, выборки запрос пропускает проверку несохраненных изменений и возвращает только объекты, которые соответствовали предикату в постоянном магазине.

+0

Отлично! Именно то, что мне нужно. Спасибо, Мартин – fxfuture

0

NSManagedObjectContext NSFetchedResultsController автоматически сохранит контекст. Таким образом, ваши изменения уже сохранены в базе данных, прежде чем восстанавливать данные в Tableview

Основные данные могут управлять данными в памяти, которая описывает, как:

основных данных обеспечивает инфраструктуру для управления изменениями и для экономии объекты и извлекать их из хранилища. Он может использовать SQLite как один из его постоянных типов магазинов. Однако это не так, а - это база данных. (Чтобы подчеркнуть этот момент: можно, например, использовать просто магазин в памяти в приложении Вы можете использовать Core Data для отслеживания и управления изменениями, но никогда не сохраняет данные в файле.).

Чтобы решить вашу проблему, вы можете создать другой NSManagedObjectContext, который используется для сохранения временных данных. если вы хотите сохранить эти данные временные к вашей базе данных, просто создать новую NSManagedObject и скопировать данные данные из де данных временных и сохранить его на постоянной связи с базой данных

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