gpt4 book ai didi

ios - ios设备和sqlite3命令行之间的sqlite差异

转载 作者:行者123 更新时间:2023-11-29 12:55:57 24 4
gpt4 key购买 nike

我很好奇我在使用 iOS 模拟器/设备和 Mac OSX 附带的 sqlite3 命令行应用程序时遇到的差异。

在另一台机器(我的 Windows 机器)上,我从一个文本文件创建了一个 sqlite 数据库。下面是 SQLite 文件的创建语句。

如果 GeocodeData 不存在则创建表(邮政编码文本、城市文本整理 NOCASE、州文本整理 NOCASE、纬度实数、经度实数、主键(邮政编码、城市、州)在冲突时 INGORE);

我正在使用 COLLATE NOCASE 我发现 on this SO question进行不区分大小写的搜索。

当我将数据库移动到我的 Mac 时,在终端中运行 sqlite3 应用程序,我可以运行以下查询:SELECT * FROM GeocodeData WHERE City = 'elyria' AND St​​ate = 'oh'

44035|Elyria|OH|41.3724|-82.1051
44036|Elyria|OH|41.4015|-82.0771

运行此语句会从我的数据库返回 2 个结果。太棒了。

转到我正在创建的 iPad 应用程序,我正在使用 FMDatabase 来包装对 Sqlite 数据库的访问。

这是访问它的代码。

+(CLLocationCoordinate2D)getCoordinateForFilter:(GeocodingFilter *)filter
{
__block CLLocationCoordinate2D coordinate;
FMDatabaseQueue *queue = [self databaseQueue];
[queue inDatabase:^(FMDatabase *db)
{
//Determine if we're using zipcode or city/state.
NSMutableString *query = [[NSMutableString alloc] initWithString:SELECT_STATEMENT];
NSMutableDictionary *params = [NSMutableDictionary dictionary];
if(![NSString isNilOrWhitespace:filter.zipCode])//Zipcode logic
{
[query appendFormat:WHERE_CLAUSE, @"ZipCode = :zipCode "];
params[@"zipCode"] = filter.zipCode;
}
else
{
NSString *clause = nil;
if(![NSString isNilOrWhitespace:filter.city])
{
clause = [NSString stringWithFormat:WHERE_CLAUSE, @"City = :city"];
params[@"city"] = filter.city;
}
if (![NSString isNilOrWhitespace:filter.state])
{
if(clause)
clause = [NSString stringWithFormat:@"%@ AND", clause];
clause = [NSString stringWithFormat:@"%@ State = :state", clause];
params[@"state"] = filter.state;
}
[query appendString:clause];
}
FMResultSet *set = [db executeQuery:query withParameterDictionary:params];
NSMutableArray *results = [NSMutableArray array];
while ([set next])
{
double latitude = [set doubleForColumn:@"Latitude"];
double longitude = [set doubleForColumn:@"Longitude"];
[results addObject:[[CLLocation alloc] initWithLatitude:latitude longitude:longitude]];
}

[set close];
[db close];

__block double avgLat = 0.;
__block double avgLong = 0.;
[results enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
CLLocation *loc = obj;
avgLat += loc.coordinate.latitude;
avgLong += loc.coordinate.longitude;
}];

coordinate = CLLocationCoordinate2DMake(avgLat/(double)results.count, avgLong/(double)results.count);
}];

return coordinate;
}

这运行的查询与我在 sqlite3 命令行中使用的查询完全相同,但每次都返回 0 个结果。

现在,我可以通过更改这 4 行代码来解决问题。

clause = [NSString stringWithFormat:WHERE_CLAUSE, @"City LIKE :city"];
params[@"city"] = [NSString stringWithFormat:@"%%%@%%", filter.city];

clause = [NSString stringWithFormat:@"%@ State LIKE :state", clause];
params[@"state"] = [NSString stringWithFormat:@"%%%@%%", filter.state];

但我在创建语句中显式创建了表以使用 COLLATE NOCASE。为什么这行不通?

编辑:显然我需要重申这个问题。问题是 NOT LIKE 查询!

我想知道为什么这个查询:SELECT * FROM GeocodeData WHERE City = 'elyria' AND St​​ate = 'oh' 在命令行上返回 2 个结果,同时运行 THIS EXACT SAME QUERY 在带有 FMDatabase 的 iOS 环境中返回 0 个结果。

最佳答案

我承认 SQLite 文档在某些地方组织得不好,但对于一个开源项目来说,它的准确度和精确度差不多。

查阅文档表明您不应该遇到您描述的问题,最终得出的结论是有些事情与您描述的不完全相同。

关于ios - ios设备和sqlite3命令行之间的sqlite差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21098393/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com