2014-01-13 4 views
1

Мне любопытно, в чем я столкнулся с использованием 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 результатов.

+0

Вы прочитали документацию на sqlite.org? –

+0

Я не уверен, что прочитает документация. Я показал случай, когда командная строка sqlite3 (версия 3.7.13) возвращает набор результатов, а затем работает на устройстве на iOS 7 (который запускает ту же самую версию, полученную из этого ответа, http://stackoverflow.com/questions/14288128/what-version-of-sqlite-does-ios-provide), дает мне пустой результат.Единственное, что я мог предположить, это различия в реализации двух, и я думаю, это то, о чем я прошу. Почему существует разница между этими точными версиями с тем же самым запросом? – DavidAndroidDev

+0

Итак, вы запомнили [это] (http://www.sqlite.org/optoverview.html#like_opt)? –

ответ

1

Я признаю, что документация SQLite плохо организована в местах, но это примерно так же точно и точно, как можно надеяться, для проекта с открытым исходным кодом.

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

+0

Элегантный! Ха. Спасибо за помощь. – DavidAndroidDev

Смежные вопросы