Загрузка базы данных при запуске замедляет приложение - PullRequest
0 голосов
/ 04 сентября 2010

Я не уверен, как описать это как новое для меня, и я очень жду ответа от вас, ребята.Я знаю, что вы можете быть очень заняты, но, пожалуйста, попробуйте ПОМОЧЬ мне!

Вот так.У меня есть приложение, которое загружает очень большую базу данных (хотя она имеет только 100 записей, она содержит изображения HiRes (100 МБ)).

При запуске табличное представление представляет записи строк (используя только 3 атрибута из базы данных).).Однако кажется, что база данных ВСЕ (включая изображения) загружается при запуске!Есть ли способ загрузить только 3 атрибута (что-то вроде «select»), когда приложение запускается, а затем, когда пользователь переходит к didselectrowatindexpath, загружает оставшуюся часть записи?

Потому что у меня НЕТ ИДЕИ, где искатьили что делать, я был бы признателен за помощь в кодировании!

вот код, который я использую:

#pragma mark -
#pragma mark App support

- (NSFetchedResultsController *)resetFetchedResultsController:(NSPredicate *)predicate cached:(BOOL)cached
{

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Records" inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];


    NSSortDescriptor *partDescriptor = [[NSSortDescriptor alloc] initWithKey:@"displayOrder" ascending:YES];
    NSSortDescriptor *nameDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects: partDescriptor, nameDescriptor, nil];
    [fetchRequest setSortDescriptors:sortDescriptors];


    if (predicate != nil)
        [fetchRequest setPredicate:predicate];

    NSString *cacheName = nil;
    if (cached)
        cacheName = @"Root";

    NSFetchedResultsController *aFetchedResultsController = [[[NSFetchedResultsController alloc]
                                                              initWithFetchRequest:fetchRequest
                                                              managedObjectContext:managedObjectContext
                                                              sectionNameKeyPath:nil
                                                              cacheName:cacheName] autorelease];
    aFetchedResultsController.delegate = self;

    [fetchRequest release];
    [partDescriptor release];
    [nameDescriptor release];
    [sortDescriptors release];

    NSError *error = nil;
    if (![aFetchedResultsController performFetch:&error]) {
        // Handle error
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        exit(-1);  // Fail
    }

    return aFetchedResultsController;
}







- (void)showRecords:(Records *)records animated:(BOOL)animated {
  .
    RecordsDetailViewController *detailViewController = [[RecordsDetailViewController alloc] initWithStyle:UITableViewStyleGrouped];
    detailViewController.records = records;

    [self.navigationController pushViewController:detailViewController animated:animated];
    [detailViewController release];
}


#pragma mark -
#pragma mark Table view methods


- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    cell.backgroundColor = [UIColor lightGrayColor];
}



- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    NSInteger count = [[fetchedResultsController sections] count];

    if (count == 0) {
        count = 1;
    }

    return count;
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSInteger numberOfRows = 0;

    if ([[fetchedResultsController sections] count] > 0) {
        id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
        numberOfRows = [sectionInfo numberOfObjects];
    }

    return numberOfRows;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *RecordCellIdentifier = @"RecordCellIdentifier";

    RecordTableViewCell *recordCell = (RecordTableViewCell *)[tableView dequeueReusableCellWithIdentifier:RecordCellIdentifier];
    if (recordCell == nil) {
        recordCell = [[[RecordTableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:RecordCellIdentifier] autorelease];
        recordCell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }

    [self configureCell:recordCell atIndexPath:indexPath];

    return recordCell;
}


- (void)configureCell:(RecordTableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
    // Configure the cell
    Records *records = (Records *)[fetchedResultsController objectAtIndexPath:indexPath];
    cell.records = records;
}



- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (self.searchDisplayController.isActive)
        [self.tableView reloadData];


    Records *records = (Records *)[fetchedResultsController objectAtIndexPath:indexPath];

    [self showRecords:records animated:YES];
}

// это из RecordTableViewCell.m, чтобы показать вам атрибуты, которые я использую:

#pragma mark -
#pragma mark Record set accessor

- (void)setRecord:(Record *)newRecord {
    if (newRecord != record) {
        [record release];
        record = [newRecord retain];
    }
    imageView.image = [UIImage imageNamed:@"icon.png"];
    nameLabel.text = record.name;
    overviewLabel.text = record.overview;
    partLabel.text = record.part;
}

еще раз спасибо ...

Ответы [ 2 ]

0 голосов
/ 05 сентября 2010

Хорошо, вот и все.Я отказался от идеи загрузки отдельно необходимых мне атрибутов при запуске.То, что я сделал и сейчас работает безупречно, - это создаю ОТНОШЕНИЯ в моей модели.Изображения теперь загружаются только при вызове!

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

Однако я рад, что я сделал!

СЕЙЧАС все работает как надо !!

Happy Developer !!

0 голосов
/ 04 сентября 2010

Я бы отделил большой файл от метаданных, потому что мне нравится иметь возможность отдельно управлять этими дорогими ресурсами. Тогда я мог бы хранить их по-другому, например, файловая система или http-сервер. Это позволяет мне предварительно кэшировать их или отправлять в удаленные местоположения, чтобы сократить время загрузки

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

Вы можете просто обратиться к тяжелому ресурсу по Id

...