FMDB SQLite вопрос: количество строк запроса? - PullRequest
22 голосов
/ 01 октября 2010

Кто-нибудь знает, как вернуть счетчик запроса при использовании FMDB? Если я выполню Query @ "select count (*) from sometable were ...", я получу пустой FMResultSet Как я могу получить количество строк запроса? Нужно ли мне сделать запрос типа «выбрать * из таблицы, где ...» и выполнить итерацию по набору результатов? Или я могу использовать useCount или как лучше (с точки зрения производительности) сделать это?

Спасибо!

Ответы [ 8 ]

88 голосов
/ 01 декабря 2010

Сокращенный код для выполнения того же:

NSUInteger count = [db intForQuery:@"SELECT COUNT(field) FROM table_name"];

Обязательно включите заголовочный файл FMDatabaseAdditions.h для использования intForQuery:.

20 голосов
/ 22 ноября 2010

попробуйте это. Меня устраивает. Повторение всех записей не рекомендуется.

FMResultSet *rs = [db executeQuery:@"select count(FIELD) as cnt from TABLENAME"];
while ([rs next]) {
    NSLog(@"Total Records :%d", [rs intForColumn:@"cnt"]);
}

Может быть, вам стоит проверить пункт «Где».

4 голосов
/ 20 января 2016

Swift 2 Пример

Этот фрагмент кода напечатает счет для вас.

if let rs = db.executeQuery("SELECT COUNT(*) as Count FROM TABLE_NAME", withArgumentsInArray: nil) {
    while rs.next() {
        print("Total Records:", rs.intForColumn("Count"))
    }
}

Если не получилось, несколько предложений:

a) Найдите строку в вашем проекте, которая говорит let database = или var database =. Если вы найдете его, измените db на database
б) Изменили ли вы TABLE_NAME в операторе Select на имя вашей таблицы?

3 голосов
/ 20 декабря 2013

Первый тоже правильный, но с помощью этого метода вы можете извлекать записи и подсчитывать, используя тот же запрос, без головной боли написать другой.Просто добавьте count (*) в качестве count к вашему запросу.

Вы всегда можете просто запустить правильный оператор SQL.Я делаю что-то вроде:

FMResultSet *rs = [database executeQuery:@"select count(*) as count from words"];
[rs next];

wordsThatExist = [rs intForColumn:@"count"];

Настройка SQL-запроса может быть быстрее и дешевле, чем итерация. Я считаю, что подсчет дешево.

1 голос
/ 07 февраля 2017

обновлено для Swift 3 незначительное изменение в "int For Column"

if let rs = db.executeQuery("SELECT COUNT(*) as Count FROM TABLE_NAME", withArgumentsInArray: nil) {
while rs.next() {
    print("Total Records:", rs.int(forColumn: "Count"))
    }
}
0 голосов
/ 20 декабря 2018

обновлено для Swift 4 незначительное изменение имени параметра метода

if let rs = db.executeQuery("SELECT COUNT(*) as Count FROM TABLE_NAME", withArgumentsIn: nil) {
while rs.next() {
    print("Total Records:", rs.int(forColumn: "Count"))
    }
}
0 голосов
/ 07 июля 2016

Пожалуйста, попробуйте следующий код, это работает для меня

let objManager = ModelManager.getInstance()

objManager.database?.open()

let resultSet1: FMResultSet! = sharedInstance.database!.executeQuery("SELECT COUNT(Field) FROM TableName”, withArgumentsInArray:nil)

        if (resultSet1 != nil)
        {
            while resultSet1.next()
            {
              countRecord = Int(resultSet1.intForColumn("COUNT(Field)"))
            }

        }

     print(countRecord)

Вы получите граф поля

0 голосов
/ 08 января 2015

Если вы хотите узнать количество строк перед тем, как что-то сделать с результатом, вы можете даже сделать простой запрос и запросить результат columnCount, которое даст вам количество строк, и вы можете сохранить один запрос, если вы действительно хотите сделать что-то с результатом Set

FMResultSet *results = [database executeQuery:@"SELECT * from tableName"];
int numberOfRows = [results columnCount];

while ([results next]){
... do your stuff ...
}
...