Ответ 1
Более короткий код, чтобы выполнить одно и то же:
NSUInteger count = [db intForQuery:@"SELECT COUNT(field) FROM table_name"];
Обязательно включите заголовочный файл FMDatabaseAdditions.h
, чтобы использовать intForQuery:
.
Кто-нибудь знает, как вернуть счетчик запросов при использовании FMDB? Если я executeQuery @ "select count (*) from sometable, были..." Я возвращаю пустой FMResultSet. Как я могу получить количество строк запроса? Нужно ли делать запрос типа "select * from sometable where.." и повторять набор результатов? Или я могу использовать useCount или как наилучшим образом (с точки зрения производительности) сделать это?
Спасибо!
Более короткий код, чтобы выполнить одно и то же:
NSUInteger count = [db intForQuery:@"SELECT COUNT(field) FROM table_name"];
Обязательно включите заголовочный файл FMDatabaseAdditions.h
, чтобы использовать intForQuery:
.
попробуйте это. Меня устраивает. Итерация всех записей не рекомендуется.
FMResultSet *rs = [db executeQuery:@"select count(FIELD) as cnt from TABLENAME"];
while ([rs next]) {
NSLog(@"Total Records :%d", [rs intForColumn:@"cnt"]);
}
Возможно, вам стоит проверить предложение Where.
Этот фрагмент кода напечатает счетчик для вас.
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
b) Вы изменили TABLE_NAME в инструкции Select на то, что вы вызываете в вашей таблице?
Первый тоже прав, но с помощью этого метода вы можете извлекать записи и подсчитывать, используя один и тот же запрос, без головной боли, чтобы написать еще один. Просто добавьте count (*) в качестве счетчика к вашему запросу.
Вы всегда можете просто запустить правильную инструкцию SQL. Я делаю что-то вроде:
FMResultSet *rs = [database executeQuery:@"select count(*) as count from words"];
[rs next];
wordsThatExist = [rs intForColumn:@"count"];
Настройка SQL-запроса может быть быстрее и дешевле, чем повторение. Я считаю, что подсчеты дешевы.
обновлено для 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"))
}
}
Пожалуйста, попробуйте следовать коду, это работает для меня
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)
Вы получите граф поля
обновлено для 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"))
}
}
Если вы хотите узнать количество строк перед тем, как сделать что-то с результатом, вы даже можете сделать простой запрос и запросить результат columnCount, который даст вам количество строк, и вы можете сохранить один запрос, если вы действительно хотите сделать что-то с resultSet
FMResultSet *results = [database executeQuery:@"SELECT * from tableName"];
int numberOfRows = [results columnCount];
while ([results next]){
... do your stuff ...
}