Просмотр булавки из sqlite на карте, как я могу сделать это быстрее? - PullRequest
1 голос
/ 23 августа 2011

я работаю над приложением, которое просматривает контакты на карте

приложение читает контакты из базы данных SQLite, используя этот код:

- (void) readDB
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docDir = [paths objectAtIndex:0];

    NSString *filename = @"places.db";
    NSString *filedocPath = [docDir stringByAppendingPathComponent:filename];

    BOOL success;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    success = [fileManager fileExistsAtPath:filedocPath];

    if(success == NO)
    {
        NSString *configPathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:filename];

        [fileManager copyItemAtPath:configPathFromApp toPath:filedocPath error:nil];
        [fileManager release];
    }

    FMDatabase* db = [FMDatabase databaseWithPath:filedocPath];
    if (![db open]) {
        NSLog(@"Could not open db.");
        return;
    }

    // kind of experimentalish.
    [db setShouldCacheStatements:YES];


/*read*/
    for(int i = 0; i <colNum; i++)
    {
        [poi_Infos addObject:[[NSMutableArray alloc] init]];
    }

    NSString *queryString=[NSString stringWithFormat:@"select Category as %@,* from Places",categoryName];
    FMResultSet *rs = [db executeQuery:queryString];
    while ([rs next])
    {
        // just print out what we've got in a number of formats.
        [ [poi_Infos objectAtIndex:0] addObject:[rs stringForColumn:@"Company Name"]];
        [ [poi_Infos objectAtIndex:1] addObject:[NSNumber numberWithDouble:[[rs stringForColumn:@"Latitude"] doubleValue]] ];
        [ [poi_Infos objectAtIndex:2] addObject:[NSNumber numberWithDouble:[[rs stringForColumn:@"Longitude"] doubleValue]] ];
    }
    [rs close];  

    [db close];

    //NSLog(@"%@,%@", [[poi_Infos objectAtIndex:0] objectAtIndex:0],[[poi_Infos objectAtIndex:1] objectAtIndex:0]);

}

- (void) displayLocalPOI
{
    CLLocationCoordinate2D CurrentLocation;

    CurrentLocation=map.userLocation.coordinate;



    //set the radius in km so that you will get the nearest location in that radius

    double radius=localSearchRadius;


    int num = [[poi_Infos objectAtIndex:0] count];
    for(int i = 0; i < num; i++)
    {
        double y = [[[poi_Infos objectAtIndex:1] objectAtIndex:i] doubleValue];
        double x = [[[poi_Infos objectAtIndex:2] objectAtIndex:i] doubleValue];

        if(y>=CurrentLocation.latitude-(radius/111)&&y<=CurrentLocation.latitude+(radius/111))
        {
            if(x>=CurrentLocation.longitude-(radius/111)&&x<=CurrentLocation.longitude+(radius/111))
            {

                CLLocationCoordinate2D coord = CLLocationCoordinate2DMake(
                                                                          (CLLocationDegrees)y, 
                                                                          (CLLocationDegrees)x);

                NSString *title = [[poi_Infos objectAtIndex:1] objectAtIndex:i];

                UserAnnotation *userAnnotation = [[UserAnnotation alloc] initWithCoordinate:coord];
                userAnnotation.title = title;
                [self.mapAnnotations addObject:userAnnotation];

                [userAnnotation release];
            }
        }



    }



}

, поскольку у меня больше, чем10 000 пинт, приложение работает очень медленно.

Мой вопрос:

1 - есть ли способ ускорить процесс?Как выбрать только контакты в ближайшем месте в радиусе, прежде чем обрабатывать их?пожалуйста, предоставьте код.

2 - как я могу бросить больше булавок, если я уменьшу масштаб?

Ответы [ 2 ]

1 голос
/ 23 августа 2011

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

Кроме того, вот полезная страница с некоторыми общими советами о том, как заставить SQLite работать как можно быстрее:

http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html#intro

0 голосов
/ 23 августа 2011

Прежде всего, получите из базы данных SQL те значения, которые вам нужны в текущий момент. Я не думаю, что вы можете просмотреть все 10000 баллов сразу после запуска приложения. Так что делайте выбор для конкретного региона по широте и долготе объектов. А когда пользователь перетаскивает карту, обновите модель данных с помощью выводов из SQL, которые видны в текущий момент.

Добавьте аннотацию в виде пакета через addAnnotations:, это может добавить вам скорости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...