计算 SQLite 数据库中的行数

Posted

技术标签:

【中文标题】计算 SQLite 数据库中的行数【英文标题】:Count Number of Rows in a SQLite Database 【发布时间】:2011-08-24 04:02:37 【问题描述】:

我正在尝试使用以下代码来计算我的 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】:

没有 SQL 表达式来计算数据库中的行数:您可以计算每个表中的行数,然后将它们相加。

【讨论】:

【参考方案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; 

HTH

【讨论】:

谢谢康沃尔。但是我找到了一种方法来做到这一点,而无需遍历每一行,使用我在答案中提供的代码: if (sqlite3_step(stmt) == SQLITE_ERROR) ...【参考方案3】:

您必须单独计算每张桌子的数量。一些伪代码:

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)

【讨论】:

对不起。我应该更具体。我的意思是计算表中的行数,因为我的数据库只有一个表。我会纠正我的问题。【参考方案4】:

我遇到了一个解决方案,使用上面的代码,只需将 step 语句替换为下面的代码:

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);

【讨论】:

【参考方案5】:

我想我会在这里花两分钱,因为有一个表达式可以计算数据库中的行数,我在使用 php 脚本处理 mysql 数据库时一直使用它。我在一个 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);

不需要花哨的循环计数器。顺便说一句,如果您使用自动增量 int 作为主键。它的工作原理与数组的键略有不同。其中,在一个有 n 项长的数组中,有效的数组元素是从 0 到 n-1 在数据库中,关键字段是从 1 到 n 足够简单,只要记住这一点就可以解决。

【讨论】:

【参考方案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];

【讨论】:

以上是关于计算 SQLite 数据库中的行数的主要内容,如果未能解决你的问题,请参考以下文章

计算本周特定日期的行数 sqlite

如何使用 JS、Node.JS 和 Discord.JS 获取 SQLITE 数据库中的行数?

重置 SQLite3/MySQL 中的行数计数

Android中的SQLite查询来计算行数

SQL 计算表中的行数

在不计算的情况下获取 Spark 数据框中的行数