Получить количество строк из базы данных sqlite в iPhone ios - PullRequest
13 голосов
/ 15 февраля 2011

Фон

Весь день я пытался решить проблему, я прочитал все статьи и документацию, которые мог найти в Интернете, но я не могу решить эту проблему. Я пишу приложение для 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 что-то идет не так ...

1 Ответ

43 голосов
/ 15 февраля 2011

Спасибо за обновление, я полагаю, проблема в том, что вы проверяете против 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...