Количество строк в базе данных SQLite

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

- (void) countRecords {
    int rows = 0;
    @try {
            NSString *dbPath = [self getDBPath];

            if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {

                NSString *strSQL;
                strSQL = @"SELECT COUNT(*) FROM MYTABLE";
                const char *sql = (const char *) [strSQL UTF8String];
                sqlite3_stmt *stmt;

                if (sqlite3_prepare_v2(database, sql, -1, &stmt, NULL) == SQLITE_OK) {

                    // THIS IS WHERE IT FAILS:

                    if (SQLITE_DONE!=sqlite3_step(stmt) ) {

                        NSAssert1(0,@"Error when counting rows  %s",sqlite3_errmsg(database));

                    } else {
                        rows = sqlite3_column_int(stmt, 0);
                        NSLog(@"SQLite Rows: %i", rows);
                    }

                    sqlite3_finalize(stmt);
                }

                sqlite3_close(database);

            }

        }

        @catch (NSException * e) {
        NSLog(@"Error Counting");
        }
}

Ответ 1

Я нашел решение, используя мой код выше, просто заменив инструкцию шага следующим кодом:

if (sqlite3_step(stmt) == SQLITE_ERROR) {
    NSAssert1(0,@"Error when counting rows  %s",sqlite3_errmsg(database));
} else {
    rows = sqlite3_column_int(stmt, 0);
    NSLog(@"SQLite Rows: %i", rows);
}

Ответ 2

Это обычно работает для меня

- (NSInteger )numberRecordsForTable:(NSString *)table {
NSInteger numTableRecords = -1;
if (sqlite3_open([self.dbPath UTF8String], &database) == SQLITE_OK) {
    NSString *sqlStatement = [NSString stringWithFormat: @"select count(*) from %@", table];
    const char *sql = [sqlStatement cStringUsingEncoding:NSUTF8StringEncoding];
    if(sqlite3_prepare_v2(database, sql, -1, &sqlClause, NULL) == SQLITE_OK) {          
        while(sqlite3_step(sqlClause) == SQLITE_ROW) {
            numTableRecords = sqlite3_column_int(sqlClause, 0);
        }
    }
    else {
        printf("could not prepare statement: %s\n", sqlite3_errmsg(database));
    }
}
else {
    NSLog(@"Error in Opening Database File");
}
sqlite3_close(database);
return numTableRecords; 

}

НТН

Ответ 3

Нет выражения SQL для подсчета строк в базе данных: вы можете подсчитывать строки в каждой таблице, а затем добавлять их.

Ответ 4

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

sqlite3 *database;
if(sqlite3_open([dbpath UTF8String], &database) == SQLITE_OK)
{
    NSString *sql = @"select count(*) from today";
    sqlite3_stmt *selectStatement;
    int returnValue = sqlite3_prepare_v2(database, [sql UTF8String], -1, &selectStatement, NULL);
    if (returnValue == SQLITE_OK) 
    {
        if(sqlite3_step(selectStatement) == SQLITE_ROW)
        {
            numrows= sqlite3_column_int(selectStatement, 0);
        }
    }
    sqlite3_finalize(selectStatement);
    sqlite3_close(database);
}

нет необходимости в причёске. btw, если вы используете автоматический инкремент int для первичного ключа. он работает немного иначе, чем ключ массива. где, как и в массиве с длиной n элементов, действительные элементы массива от 0 до n-1 в базе данных, поле ключа от 1 до n достаточно просто, чтобы работать, если вы просто это помните.

Ответ 5

Вам придется рассчитывать каждую таблицу отдельно. Некоторые псевдо-коды:

sql = "SELECT name FROM sqlite_master" WHERE type = 'table'
tables() = GetRows(sql)

Dim total As Integer
For Each t As String in tables
  sql = "SELECT COUNT(*) FROM " + t
  total = total + GetValue(sql)
Next

Show(total)

Ответ 6

-(void)databaseRecordCount{
    int rows = 0;
    @try {
        sqlite3 *database;
        NSString *filePath = [self databaseDocumentsFilePath];
        if(sqlite3_open([filePath UTF8String], &database) == SQLITE_OK) {
            NSString *query = @"SELECT * FROM MYTABLE";
            sqlite3_stmt *compiledStatement;
            if(sqlite3_prepare_v2(database, [query UTF8String], -1, &compiledStatement, NULL) != SQLITE_OK)
                NSLog(@"Error while creating detail view statement. '%s'", sqlite3_errmsg(database));
            if(sqlite3_prepare_v2(database, [query UTF8String], -1, &compiledStatement, nil) == SQLITE_OK) {
                while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
                    rows++;
                }
                sqlite3_finalize(compiledStatement);
            }
            sqlite3_close(database);
        }
    }
    @catch (NSException * e) {
        NSLog(@"Error Counting");
    }
    NSLog(@"SQLite Rows: %i", rows);
    NSUserDefaults *userDefaults;
    userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setInteger:rows forKey:@"databaseRecordCount"];
    [userDefaults synchronize];
}