2012-03-06 72 views
4

似乎没有关于此在线的任何内容,我需要按距离用户当前位置排序运行提取查询。我的第一个计划是要建立一个短暂的财产......是否可以在核心数据中使用自定义的sqlite函数?

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

但后来我发现核心数据将不能获取基于瞬态特性,我认为可能是如此,因为提取所变成了带有ORDER BY子句的SELECT语句,因此我的距离属性需要存在于数据库中。

好了,所以我的第二个想法是实现这一目标的方式,我在使用与sqlite3_create_function创建的自定义功能的SQLite SQLite的使用没有核心日期的另一个项目做了一样的...

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])]]); 
} 

}

现在问题是我将如何从核心数据提取查询中调用此函数?我猜它可能不可能,因为核心数据的目的是抽象出支持存储的细节,但也许有人知道不同?

+0

你的问题是“你可以使用自定义的SQLite函数与核心数据NSSQLiteStoreType”。这将是一个不。你试图完成的任务,将核心数据结果排序到已知位置的距离是很有可能的,但这将是一个不同的问题。 – quellish 2014-08-25 18:55:36

+0

@quellish是对的。为什么不使用没有核心数据的SQLite,顺便说一句? – kelin 2014-08-26 08:40:31

回答

1

你是对的,这是不可能使用核心数据。不要忘记其他支持存储类型是可能的。它将如何执行对XML的查询?

如果您只是需要对结果进行排序,为什么在执行提取后(假设数据集不是太大),请不要在数组上设置排序描述符?

+1

我想在内存排序后查询就足够了,因为数据集不应该太大,但所有的逻辑运行通过NSFetchedResultsController – nbransby 2012-03-08 13:31:26

+0

你不能设置排序描述符的获取控制器的获取请求? – sosborn 2012-03-08 13:49:37

+0

是的,但唯一支持的排序是什么可以通过sqlite作为排序在查询时间应用。所以没有瞬态属性或方法调用 – nbransby 2012-03-08 14:09:50

0

我打算建议走下一条不同的道路。

从您的自定义函数看来,您正在进行某种GIS工作。我只是做了一个快速谷歌,看到有一个GIS扩展名为sqlite:Gaia-SINS

我认为你会更好地滚动自己的SQLite库,并添加一个像这样的扩展,利用其他人民GIS计算。为什么在其他人为你做的时候推出自己的GIS方程?

作为一个起点,看其他像这样的问题:compiling-custom-sqlite-for-an-iphone-app

+0

谢谢,但这意味着放弃核心数据,这可能会涉及重写约50%的应用程序。我想要做的唯一的计算是距离,所以我认为这将是一个矫枉过正的问题 – nbransby 2012-03-08 13:27:23

0

它不可能调用提取请求瞬态特性。在找到解决方法后的很多天,我都在处理同一问题。我计算每个元素的距离并选择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]; 
} 
相关问题