【问题标题】:SQLite3 COUNT incorrectSQLite3 COUNT 不正确
【发布时间】:2011-05-12 10:16:02
【问题描述】:

假设我有一个名为 Incidents 的表和一个名为 Devices 的表。

每个设备都有一个 CI 代码。

我想创建一个 tableView,在部分中包含设备 (CI) 的名称,以及代表事件的每一行。 为了获得每个部分下的正确行数,我使用以下代码:

NSMutableArray *lijstDevices = [[NSMutableArray alloc] init];
const char *dbpath = [appDelegate.databasePath UTF8String];
sqlite3_stmt *statement;

if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK)
{
    NSString *querySQL = [NSString stringWithFormat:@"SELECT DISTINCT CI FROM Devices"];
    const char *query_stmt = [querySQL UTF8String];

    if (sqlite3_prepare_v2(contactDB, query_stmt, -1, &statement, NULL) == SQLITE_OK)
    {
        while (sqlite3_step(statement) == SQLITE_ROW)
        {
            //  NSLog(@"SQLite ROW for filling in cell");
            NSString *addDev = [[NSString alloc] initWithUTF8String:(const char *)sqlite3_column_text(statement, 0)];
            [lijstDevices addObject:addDev];
         }
         sqlite3_finalize(statement);
    }

    NSString *ciNaam = [lijstDevices objectAtIndex:section];

     NSString *querySQL2 = [NSString stringWithFormat:@"SELECT COUNT(ID) FROM Incidents WHERE CI='%@'", ciNaam];
     const char *query_stmt2 = [querySQL2 UTF8String];

     if (sqlite3_prepare_v2(contactDB, query_stmt2, -1, &statement, NULL) == SQLITE_OK)
     {
         //NSLog(@"SQLite ok in rowforindexpath");
         if(sqlite3_step(statement) == SQLITE_ROW) {
             //  NSLog(@"SQLite ROW for filling in cell");
             teller = sqlite3_column_int(statement, 0);
         }
         else
         {
              NSLog(@"Not.. good...");
         }
         sqlite3_finalize(statement);
      }
    sqlite3_close(contactDB);

}

问题来了:这些部分填充正确。有些部分需要 1 行,其他部分需要 2 行。每当我运行该程序时,需要 1 行的每个部分都以 0 行结束,而需要 2 行的每个部分最终只有 1 行。

除此之外,我还有一个错误,之前没有清理表格。因此,如果我运行它两次,数据库的行数就会增加一倍。在这种情况下,每个需要 1 的人都有 2 行。每个需要 2 个的,有 4 行。显然情况不再如此,但它可能有助于理解问题所在。

有人知道吗???

【问题讨论】:

  • 尝试 SELECT * COUNT() FROM Incidents WHERE CI='%@'
  • 我猜你提到了 SELECT COUNT (*),@ViTo Brothers Apoyan,但它也没有成功:(它得到了正确的数字,只是减半......或类似的东西

标签: iphone sql objective-c ios sqlite


【解决方案1】:

你看到这个例子并检查它

-(void)ChekInDataBase{
    sqlite3 *database;

    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) 
    {   
        NSString *sqlStatement = [NSString stringWithFormat:@"SELECT count(id) as countRow FROM password"];

        sqlite3_stmt *compiledStatement;

        if(sqlite3_prepare_v2(database, [sqlStatement cStringUsingEncoding:NSUTF8StringEncoding], -1, &compiledStatement, NULL) == SQLITE_OK) 
        {
            NSLog(@"%@",sqlStatement);

            if (sqlite3_step(compiledStatement) == SQLITE_ROW) 
            {
                countRow = [[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement,0 )]intValue] ;
            }       
        }
        sqlite3_finalize(compiledStatement);

        if  (countRow > 0)
        {
            [yesBtnPressed setImage:[UIImage imageNamed:@"yes_tab_over.png"]forState:UIControlStateNormal];
            [noBtnPressed setImage:[UIImage imageNamed:@"no_tab.png"]forState:UIControlStateNormal];

            [noBtnPressed setUserInteractionEnabled:TRUE];
            [yesBtnPressed setUserInteractionEnabled:FALSE];
        }
        else    
        {  
            [yesBtnPressed setImage:[UIImage imageNamed:@"yes_tab.png"]forState:UIControlStateNormal];
            [noBtnPressed setImage:[UIImage imageNamed:@"no_tab_over.png"]forState:UIControlStateNormal];

            [noBtnPressed setUserInteractionEnabled:FALSE];
            [yesBtnPressed setUserInteractionEnabled:TRUE];
        }
        sqlite3_close(database);
    }       
}

【讨论】:

  • 我把线路改成了@"SELECT COUNT(ID) AS CountRow FROM Incidents WHERE CI='%@'", ciNaam];,但恐怕没有效果:(
  • 你在 sqllite 中检查这个查询...你会明白哪里会产生错误
【解决方案2】:

这一行没有错误。显然,CI 代码没有正确添加到表中。有时它显示 CI 代码正确(我可以在列表中看到的那些),但其他代码只有 (null) 或 1。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 2017-08-19
    • 1970-01-01
    • 2010-10-30
    • 2014-12-25
    • 1970-01-01
    相关资源
    最近更新 更多