计算SQLite数据库中的行数

时间:2011-05-12 14:06:11

标签: objective-c sqlite count

我正在尝试以下代码来计算我的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");
        }
}

6 个答案:

答案 0 :(得分:11)

我遇到了一个解决方案,使用上面的代码,只需用以下代码替换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);
}

答案 1 :(得分:5)

这通常对我有用

- (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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

我以为我会在这里投入两分钱,因为有一个表达式来计算数据库中的行数,我在使用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非常简单,只要记住这一点就可以解决。

答案 4 :(得分:1)

-(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];
}

答案 5 :(得分:0)

你必须分别统计每张桌子。一些伪代码:

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)
相关问题