Objective c 计算SQLite数据库中的行数

Objective c 计算SQLite数据库中的行数,objective-c,sqlite,count,Objective C,Sqlite,Count,我正在尝试以下代码来计算SQLite数据库表中的行数,但它引发了一个异常。这是一种更简单的方法吗 -(void)countRecords{ int行=0; @试一试{ NSString*dbPath=[self-getDBPath]; if(sqlite3_打开([dbPath UTF8String],&database)==SQLITE_确定){ NSString*strSQL; strSQL=@“从MYTABLE中选择计数(*); 常量字符*sql=(常量字符*)[strsqlutf8str

我正在尝试以下代码来计算SQLite数据库表中的行数,但它引发了一个异常。这是一种更简单的方法吗

-(void)countRecords{
int行=0;
@试一试{
NSString*dbPath=[self-getDBPath];
if(sqlite3_打开([dbPath UTF8String],&database)==SQLITE_确定){
NSString*strSQL;
strSQL=@“从MYTABLE中选择计数(*);
常量字符*sql=(常量字符*)[strsqlutf8string];
sqlite3_stmt*stmt;
if(sqlite3\u prepare\u v2(数据库,sql,-1,&stmt,NULL)==SQLITE\u确定){
//这就是它失败的地方:
如果(SQLITE_DONE!=sqlite3_步骤(stmt)){
NSAssert1(0,@“计算行%s时出错”,sqlite3_errmsg(数据库));
}否则{
行=sqlite3\u列\u int(stmt,0);
NSLog(@“SQLite行:%i”,行);
}
sqlite3_最终确定(stmt);
}
sqlite3_关闭(数据库);
}
}
@捕获(N例外*e){
NSLog(“错误计数”);
}
}

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

这通常对我有用

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

您必须单独计算每个表的数量。一些伪代码:

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)

我发现了一个解决方案,使用上面的代码,将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);
}

我想我应该在这里花两分钱,因为数据库中有一个计算行数的表达式,我一直在使用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非常简单。

数据库“内部”表的名称是什么?对不起。我模糊不清。我的意思是统计表中的行,而不是数据库。对不起。我应该说得更具体些。我的意思是计算表中的行数,因为我的DB只有一个表。我会纠正我的问题。谢谢康沃尔语。但我找到了一种方法,不必浏览每一行,而是使用我在回答中提供的代码:if(sqlite3_步骤(stmt)==SQLITE_错误){。。。
-(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];
}