计算 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 数据库中的行数的主要内容,如果未能解决你的问题,请参考以下文章