【问题标题】:Count Number of Rows in a SQLite Database计算 SQLite 数据库中的行数
【发布时间】: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");
    }
}

【问题讨论】:

  • 数据库“内部”的表的名称是什么?
  • 对不起。我含糊其辞。我的意思是计算表中的行数,而不是数据库。

标签: objective-c sqlite count


【解决方案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];
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-05-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多