Мне любопытно, в чем я столкнулся с использованием iOS Simulator/Device и приложения командной строки sqlite3, которое поставляется в комплекте с Mac OSX.Sqlite различия между ios-устройством и командной строкой sqlite3
На другой машине (моей коробке Windows) я создал базу данных sqlite из текстового файла. Вот инструкция create для файла SQLite.
Я использую COLLATE NOCASE
, как я нашел on this SO question иметь нечувствительны к регистру поиск.
Когда я перемещаю DB на свой Mac, запустив приложение sqlite3
в терминале, я могу запустить следующий запрос: SELECT * FROM GeocodeData WHERE City = 'elyria' AND State = '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
в создании заявления. Почему это не работает?
EDIT: По-видимому, мне нужно повторно повторить проблему. Проблема НЕ вопрос LIKE
!
Я хочу знать, почему этот запрос: SELECT * FROM GeocodeData WHERE City = 'elyria' AND State = 'oh'
в командной строке возвращает 2 результатов, в то время как работает ЭТА Таже ЗАПРОСА в среде IOS с FMDatabase возврата 0 результатов.
Вы прочитали документацию на sqlite.org? –
Я не уверен, что прочитает документация. Я показал случай, когда командная строка sqlite3 (версия 3.7.13) возвращает набор результатов, а затем работает на устройстве на iOS 7 (который запускает ту же самую версию, полученную из этого ответа, http://stackoverflow.com/questions/14288128/what-version-of-sqlite-does-ios-provide), дает мне пустой результат.Единственное, что я мог предположить, это различия в реализации двух, и я думаю, это то, о чем я прошу. Почему существует разница между этими точными версиями с тем же самым запросом? – DavidAndroidDev
Итак, вы запомнили [это] (http://www.sqlite.org/optoverview.html#like_opt)? –