Можно ли использовать пользовательскую функцию sqlite в основных данных? - PullRequest
4 голосов
/ 06 марта 2012

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

- (CLLocationDistance)distance {
    return [self.location distanceFromLocation:locationManager.location];   
}

Но потом я обнаружил, что базовые данные не будут выбираться на основе переходного свойства, что, как я думал, может иметь место при включении выборки.в оператор SELECT с предложением ORDER BY, поэтому мое свойство distance должно существовать в базе данных.

Хорошо, поэтому моя вторая идея заключалась в том, чтобы добиться этого так же, как в другом проекте, в котором использовался SQLite без Core Date с использованиемпользовательская функция sqlite, созданная с помощью sqlite3_create_function ...

static void sqliteDistance(sqlite3_context *context, int argc, sqlite3_value **argv) {
    if(sqlite3_value_type(argv[0])==SQLITE_NULL || sqlite3_value_type(argv[1])==SQLITE_NULL) {
        sqlite3_result_null(context);
    } else {
        sqlite3_result_double(context, [locationManager.location distanceFromLocation 
            [[CLLocation alloc] initWithLatitude: sqlite3_value_double(argv[0]) longitude: sqlite3_value_double(argv[1])]]);
}

}

Теперь вопрос, как бы я вызвал эту функцию из основного запроса на выборку данных?Я предполагаю, что это, вероятно, невозможно, так как основная цель данных состоит в том, чтобы абстрагироваться от деталей резервного хранилища, но, возможно, кто-то знает другое?

Ответы [ 3 ]

1 голос
/ 06 марта 2012

Вы правы, это невозможно с помощью Core Data. Не забывайте, что возможны другие типы бэк-магазина. Как он выполнит этот запрос к XML?

Если вам просто нужно отсортировать результаты, почему бы не установить дескриптор сортировки для массива после выполнения выборки (при условии, что набор данных не слишком большой)?

0 голосов
/ 27 августа 2014

Невозможно вызвать временное свойство в запросе на выборку.Я работаю над той же проблемой спустя много дней после того, как нашел обходной путь.Я рассчитываю расстояние каждого элемента и выбираю n первых элементов интереса.следующий метод берет результат многократного поиска по NSFetchedResultsController и возвращает число p_NumberArroundMe.

-(void) filteredCustomerPortfolioArroundMe:(NSInteger)p_NumberArroundMe
                                       for:(NSFetchedResultsController*)p_FetchedResultsController
{
    NSFetchRequest *allEtabfetchRequest = [[NSManagedObjectModel CRMManagedObjectModel] fetchRequestFromTemplateWithName:@"AllEtablissements" substitutionVariables:nil];
    NSArray *allEtabInDatabase = [[NSManagedObjectContext sharedManagedObjectContext] executeFetchRequest:allEtabfetchRequest error:nil];

    NSArray *sortedList = [allEtabInDatabase sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"distanceFromUser" ascending:YES]]];

    if ([sortedList count] > p_NumberArroundMe) {
        NSRange aRange;
        aRange.location = 0;
        aRange.length = p_NumberArroundMe;
        sortedList = [sortedList subarrayWithRange:aRange];
    }

    NSMutableArray* keyList = [NSMutableArray array];
    for (SPIREtablissementMin* item in sortedList)
    {
        [keyList addObject:item.partner];
    }

    NSPredicate *predicateArroundMe = [NSPredicate predicateWithFormat:@"partner IN %@",keyList];

    [p_FetchedResultsController.fetchRequest setPredicate:predicateArroundMe];
    [self performFetch:p_FetchedResultsController];
}
0 голосов
/ 06 марта 2012

Я собираюсь предложить пойти другим путем.

Из вашей пользовательской функции кажется, что вы выполняете какую-то работу с ГИС.Я только что сделал быстрый гугл и увидел, что есть расширение ГИС для sqlite: Gaia-SINS

Я думаю, что вам будет лучше развернуть свою собственную библиотеку sqlite и добавить расширение, такое какэто, используя расчеты ГИС других народов.Зачем бросать свои собственные уравнения ГИС, когда другие люди сделали это для вас?

В качестве отправной точки посмотрите другие вопросы SO, такие как: compiling-custom-sqlite-for-i-iphone-app

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