SQL-запрос FMDB не возвращает никаких данных

Я делаю запрос в свой FMDB, который выглядит так

long long lstartDate = 1467331200000;
long long lendDate = 1468108800000;


    [_queue inDatabase:^(FMDatabase *database) {
        FMResultSet * result = [database executeQuery:@"SELECT * FROM dayEPOCTable WHERE date >= '?' AND date <= '?' ", lstartDate, lendDate];

Однако, когда запрос завершен, в результате у меня нет доступных элементов.

У lendDate и lstartDate есть жестко закодированные значения, которые существуют в таблице, я зашел в Devices, загрузил контейнер, чтобы проверить, появляются ли эти значения в базе данных SQL.

Я пытаюсь вернуть все строки между lstartDate и lendDate, которые находятся в таблице, включительно.

ОБНОВЛЕНИЕ: приведение long long к NSNumber сработало. обновленный код выглядит следующим образом

NSNumber *lstartDate = [NSNumber numberWithLongLong:1467331200000];
     NSNumber *lendDate = [NSNumber numberWithLongLong:1468108800000];

[_queue inDatabase:^(FMDatabase *database) {
            FMResultSet * result = [database executeQuery:@"SELECT * FROM dayEPOCTable WHERE date >= '?' AND date <= '?' ", lstartDate, lendDate];

person HurkNburkS    schedule 21.09.2016    source источник


Ответы (1)


result == nil? Если это так, это означает, что произошла ошибка, и вы можете посмотреть [database lastErrorMessage], чтобы узнать, что это за ошибка.

Однако одна ошибка выскакивает у меня: когда вы используете ? заполнители в своем SQL, вы не должны использовать кавычки. Так что удалите те:

FMResultSet * result = [database executeQuery:@"SELECT * FROM dayEPOCTable WHERE date >= ? AND date <= ?", @(lstartDate), @(lendDate)];
NSAssert(result, @"executeQuery error: %@", [database lastErrorMessage]);

Конечно, может быть много других возможных источников проблем, но я бы начал именно с этого, а именно с устранения кавычек и проверки, удалось ли executeQuery или нет, и, если это не удалось, получить сообщение об ошибке SQLite.


Обратите внимание, как указано в документации executeQuery в отношении вариативных параметров, предоставленных для ? заполнителей:

Необязательные параметры для привязки к ? заполнителям в операторе SQL. Это должны быть объекты Objective-C (например, NSString, NSNumber и т. Д.), А не основные типы данных C (например, int, char * и т. Д.).

Итак, в приведенном выше примере я заменил lstartDate и lendDate на @(lstartDate) и @(lendDate). Это делает их NSNumber объектами.

person Rob    schedule 21.09.2016
comment
Я пробовал следующее, и запрос вылетает, прежде чем я могу зарегистрировать ошибку. Это приводит меня к строке 817 FMDB: obj = va_arg (args, id); Эта проблема исчезает, когда я использую '?' поэтому я не уверен, что здесь делать. - person HurkNburkS; 21.09.2016
comment
Также, если это помогает, дата сохраняется как BIGINT int в таблице - person HurkNburkS; 21.09.2016
comment
Извините, я не заметил, что это long long. Вы должны заключить их в NSNumber (например, используя синтаксис @(...) для NSNumber, если хотите, как в моем исправленном ответе). Эта вариативная версия предполагает, что все параметры будут объектами, но long long является фундаментальным типом данных. - person Rob; 21.09.2016
comment
да ладно .. это сработало! но было очень болезненно, так как не было дано полного значения ошибок. большое спасибо. - person HurkNburkS; 21.09.2016
comment
Да, мне действительно не нравятся вариативные параметры, которые используют методы FMDB, поскольку компилятор не может разумно предупредить вас об использовании параметров, не являющихся объектами. Такова жизнь. - person Rob; 21.09.2016