【问题标题】:Get Rows Count from sqlite database in iPhone ios从 iPhone ios 中的 sqlite 数据库获取行数
【发布时间】:2011-06-27 17:58:17
【问题描述】:

背景

我整天都在试图解决一个问题,我阅读了我在 Internet 上可以找到的所有文章和文档,但我无法解决这个问题。我正在为 iPhone 编写一个应用程序,我需要使用 sqlite 数据库 (sqlite3)。

主要问题

我已经创建了我的数据库并且一切都很顺利,直到我想计算我表中的行数。表名是ARTICLES,所以我写了

SELECT COUNT(*) FROM ARTICLES

我的程序什么都不做,并在日志中写入:未知错误。

const char *query = "SELECT COUNT (*) FROM ARTICLES";
sqlite3_stmt *compiledQuery;
sqlite3_prepare_v2(database, query, -1, &compiledQuery, NULL);

程序在上述代码中给出消息“未知错误”,我无法获得行数。 谁能帮我解决这个问题......或者可能是sqlite的东西不正确?

代码

- (int) GetArticlesCount
{
    if (sqlite3_open([self.dataBasePath UTF8String], &articlesDB) == SQLITE_OK)
    {
        const char* sqlStatement = "SELECT COUNT(*) FROM ARTICLES";
        sqlite3_stmt *statement;

        if( sqlite3_prepare_v2(articlesDB, sqlStatement, -1, &statement, NULL) == SQLITE_OK )
        {
            if( sqlite3_step(statement) == SQLITE_DONE )
            {
   
            }
            else
            {
                NSLog( @"Failed from sqlite3_step. Error is:  %s", sqlite3_errmsg(articlesDB) );
            }
        }
        else
        {
            NSLog( @"Failed from sqlite3_prepare_v2. Error is:  %s", sqlite3_errmsg(articlesDB) );
        }

        // Finalize and close database.
        sqlite3_finalize(statement);
        sqlite3_close(articlesDB);
    }

    return 0;
}

在这一行出现未知错误:

NSLog( @"Failed from sqlite3_step. Error is:  %s", sqlite3_errmsg(articlesDB) );

我必须在代码中添加什么或者我必须做什么才能获得行数?请帮忙...

工作代码(无效)

const char* sqlStatement = "SELECT * FROM ARTICLES";
sqlite3_stmt *statement;
if( sqlite3_prepare_v2(articlesDB, sqlStatement, -1, &statement, NULL) == SQLITE_OK )
{
    int count = 0;
    while( sqlite3_step(statement) == SQLITE_ROW )
        count++;
}

我得到了正确的行数!但我不认为这是一种有效的方法......我认为使用 sqlite 的东西不正确......

【问题讨论】:

    标签: iphone ios sqlite count


    【解决方案1】:

    感谢您的更新,我认为问题是您检查了SQLITE_DONE 而不是SQLITE_ROW,所以我在下面更新了您的方法:

    - (int)getArticlesCount {
      int count = 0;
      if (sqlite3_open([self.dataBasePath UTF8String], &articlesDB) ==
          SQLITE_OK) {
        const char* sqlStatement = "SELECT COUNT(*) FROM ARTICLES";
        sqlite3_stmt *statement;
    
        if (sqlite3_prepare_v2(articlesDB, sqlStatement, -1, &statement, NULL) ==
            SQLITE_OK) {
          // Loop through all the returned rows (should be just one)
          while(sqlite3_step(statement) == SQLITE_ROW) {
            count = sqlite3_column_int(statement, 0);
          }
        } else {
            NSLog(@"Failed from sqlite3_prepare_v2. Error is:  %s",
                  sqlite3_errmsg(articlesDB));
        }
    
        // Finalize and close database.
        sqlite3_finalize(statement);
        sqlite3_close(articlesDB);
      }
    
      return count;
    }
    

    【讨论】:

    • if( sqlite3_open([self.dataBasePath UTF8String], &articlesDB) == SQLITE_OK) { const char* sqlStatement = "SELECT COUNT() FROM ARTICLES"; sqlite3_stmt 语句; sqlite_3prepare_v2(articlesDB, sqlStatement, -1, &statement, NULL);如果(sqlite3_step(语句)== SQLITE_DONE){ NSLog(@“完成”); } else NSLog(@"Fail ... Error is: %s", sqlite3_errmsg(articlesDB));这里出现“未知错误”。
    猜你喜欢
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 2010-11-04
    • 2013-07-28
    相关资源
    最近更新 更多