база данных iphone с использованием оболочки sqlite и fmdb - медленный пользовательский интерфейс - PullRequest
1 голос
/ 31 января 2012

Я создал базу данных для iphone с использованием sqlite и оболочки fmdb.

База данных содержит примерно 3500 строк.Он имеет 14 столбцов: 1 для идентификатора, 1 для имени / основного поискового термина, 9 других столбцов для альтернативных поисковых терминов и 3 других столбца для кратких описаний.

Первое представление моего приложения - просто вводный экран, отображающийпанель поиска, немного похожая на Google.После реализации панели поиска вы попадете в другое представление, содержащее таблицу с желаемыми результатами.В этом начальном переходе между представлениями существует задержка в 1 или 2 секунды.Кроме того, таблица не допускает плавной прокрутки.Наконец, когда вы выбираете ячейку таблицы, она плавно переводит вас в окончательное представление, но при попытке вернуться к представлению таблицы возникает еще одна задержка в 1 или 2 секунды.

Я запустил это приложениес меньшей базой данных, которая имеет 3500 строк, но только 5 столбцов.В этом случае 9 альтернативных поисковых терминов удаляются из базы данных.Когда я запускаю такое приложение на iphone, оно довольно эффективно ... есть небольшая задержка, но на самом деле это не заметно ... Я бы, наверное, не заметил отставание, (я бы простоПредполагается, что небольшая задержка является нормальным явлением), если это не было так очевидно с большой базой данных, которую я использую.

Я пришел к выводу, что база данных sqlite нуждается в некоторой настройке, и поэтому у меняосновные вопросы.

  1. Я читал, что изменение параметров прагмы (например, синхронный, режим журнала, размер кэша) для базы данных sqlite повысит эффективность.Когда я изменяю эти настройки через плагин mozilla, они, похоже, не сохраняются ... Я открою и закрою плагин, и настройки вернутся к старым настройкам по умолчанию.Я видел, что вы можете установить их через xcode ... мне интересно, где в обертке FMDB установить эти настройки?
  2. Я слышал, что индексирование может значительно увеличить скорость.Хотя я не знаю, что индексировать, и если я что-то индексирую, нужно ли мне вносить изменения в кодировку оболочки FMDB?Кроме того, что я должен индексировать, учитывая, что в идеальной ситуации я хотел бы использовать все данные в моей базе данных (хотя некоторые столбцы я буду использовать иначе, чем другие)?

- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {статический NSString * CellIdentifier = @ "CustomCell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }

    Data *data = [[[DataController instance]filterDataWithName:searchString:searchString:searchString:searchString:searchString:searchString:searchString:searchString:searchString:searchString]objectAtIndex:indexPath.row];

    cell.textLabel.text = data.aDataName;
    cell.detailTextLabel.text = data.aDataStatus; 

    // Configure the cell.
    return cell;
}

-(NSMutableArray*)filterDataWithName:(NSString*)aDataName:(NSString*)altSearchTermA:(NSString*)altSearchTermB:(NSString*)altSearchTermC:(NSString*)altSearchTermD:(NSString*)altSearchTermE:(NSString*)altSearchTermF:(NSString*)altSearchTermG:(NSString*)altSearchTermH:(NSString*)altSearchTermI;

 {

    if ((aDataName && [aDataName length] > 0) && (altSearchTermA && [altSearchTermA length] > 0) && (altSearchTermB && [altSearchTermB length] > 0) && (altSearchTermC && [altSearchTermC length] > 0) && (altSearchTermD && [altSearchTermD length] > 0) && (altSearchTermE && [altSearchTermE length] > 0) && (altSearchTermF && [altSearchTermF length] > 0) && (altSearchTermG && [altSearchTermG length] > 0) && (altSearchTermH && [altSearchTermH length] > 0) && (altSearchTermI && [altSearchTermI length] > 0))
    {
        NSMutableArray *filterDataArray = [[NSMutableArray alloc]initWithArray:dataList];

        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(aDataName CONTAINS[cd] %@) OR (altSearchTermA CONTAINS[cd] %@) OR (altSearchTermB CONTAINS[cd] %@) OR (altSearchTermC CONTAINS[cd] %@) OR (altSearchTermD CONTAINS[cd] %@) OR (altSearchTermE CONTAINS[cd] %@) OR (altSearchTermF CONTAINS[cd] %@) OR (altSearchTermG CONTAINS[cd] %@) OR (altSearchTermH CONTAINS[cd] %@) OR (altSearchTermI CONTAINS[cd] %@)", aDataName, altSearchTermA,altSearchTermB,altSearchTermC,altSearchTermD,altSearchTermE,altSearchTermF,altSearchTermG,altSearchTermH,altSearchTermI];

        [filterDataArray filterUsingPredicate:predicate];
        return filterDataArray;
    }
    else
    {
        return dataList;
    }

    }

Ответы [ 2 ]

1 голос
/ 01 февраля 2012

cellForRowAtIndexPath вызывается для каждой созданной ячейки, поэтому ваша функция filterDataWithName вызывается для каждой ячейки / строки.

Вызовите свой метод filterDataWithName где-то еще и просто используйте NSMutableArray в cellForRowAtIndexPath с чем-то вроде

cell.textLabel.text = [[filterDataArray objectAtIndex: indexpath.row] data.aDataName];

0 голосов
/ 13 марта 2012

Хорошо - я пропустил описанную Дарреном проблему, описанную Дарреном, если это не помогло ... Я столкнулся с подобной проблемой, когда мне нужно было выполнить исчерпывающий поиск по таблице. Вы можете попытаться ограничить ваш запрос одной строкой, например:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    Level2CustomCell *cell = (Level2CustomCell*) [tableView dequeueReusableCellWithIdentifier:kCellIdentifier];
    if (cell == nil)
    {
        cell = [[[Level2CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellIdentifier] autorelease];
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    // SEARCH ENGINE TIME
    NSString *likeTitle = [NSString stringWithFormat:@" TITLE LIKE '%@%@%@'",@"%",msgView.searchBar.text,@"%"];
    NSString *likeSearch = [NSString stringWithFormat:@" SORT4='%@' AND SEARCH LIKE '%@%@%@'",selectedSection,@"%",msgView.searchBar.text,@"%"];
    NSString *likeAddress = [NSString stringWithFormat:@" SORT4='%@' AND ADDRESS LIKE '%@%@%@'",selectedSection,@"%",msgView.searchBar.text,@"%"];
    NSString *likeContent = [NSString stringWithFormat:@" SORT4='%@' AND CONTENT LIKE '%@%@%@'",selectedSection,@"%",msgView.searchBar.text,@"%"];


    qry = [NSString stringWithFormat: @"select * from SPOT_INFO WHERE SORT4 = '%@' AND %@ OR %@ OR %@ OR %@ order by TITLE limit 1 offset %d",selectedSection,likeTitle,likeSearch,likeAddress,likeContent,[indexPath row]];


    DLog(@"qry :%@",qry);

    FMResultSet *rs =   [appDelegate.userdb executeQuery:qry];

    if ([rs next]) {
        NSString *title = [rs stringForColumn:@"TITLE"];
        DLog(@"title %@",title);
        NSString *content = [rs stringForColumn:@"CONTENT"];
        NSString *imgFileName = [rs stringForColumn:@"IMG_NAME"];

    }
    [rs close];

}

Я рекомендую базу данных egod, которая имеет неблокирующий код gcd (большой центральной диспетчерской) https://github.com/jdp-global/egodatabase

...