2011-05-12 25 views
11

Estoy intentando el siguiente código para contar el número de filas en mi tabla de base de datos SQLite, pero arroja una excepción. ¿Es esta una forma más simple de hacer esto?Número de filas en una base de datos 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"); 
     } 
} 
+0

¿Cuál es el nombre de la tabla "dentro" de la base de datos? – Tim

+0

Lo siento. Yo era vago Quería contar las filas en una tabla, no una base de datos. –

Respuesta

11

me encontré con una solución, usando mi código anterior, sólo la sustitución de la sentencia de paso con el código de abajo:

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

no hay expresión SQL para contar las filas de una base de datos: usted puede contar las filas de una cada mesa y luego sumarlos.

5

Esto generalmente funciona para mí

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

+0

Gracias Cornish. Pero encontré una forma de hacerlo sin pasar por cada fila, usando el código que proporcioné en mi respuesta: if (sqlite3_step (stmt) == SQLITE_ERROR) {... –

0

Vas a tener que contar de cada tabla individualmente. Algunos pseudo código:

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) 
+0

Lo siento. Debí haber sido más especifico. Me refiero a contar el número de filas en una tabla ya que mi base de datos tiene una sola tabla. Voy a corregir mi pregunta. –

1

pensé que TROW en mis dos centavos aquí como hay una expresión para contar filas en una base de datos, la utilizo cuando trato con bases de datos MySQL usando scripts php todo el tiempo. y he comprobado en una aplicación para iOS está disponible en allí también he aquí:

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

hay necesidad de que una cosa contador del bucle de fantasía. Por cierto, si estás usando un incremento automático int para la clave principal. funciona ligeramente diferente de la tecla de una matriz. donde como en una matriz que tiene n elementos largos, los elementos de matriz válidos son de 0 a n-1 en una base de datos, el campo de clave va de 1 a n lo suficientemente simple como para funcionar si lo tiene en cuenta.

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