Подтвердить что ты не робот

Получите количество строк из базы данных sqlite в iPhone ios

Фон

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

4b9b3361

Ответ 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;
}

Ответ 2

Получить количество строк из базы данных SQLite в iPhone (ios)

Вот решение для моей проблемы. Простое решение, которое нуждается только в опыте и знаниях в базе данных Sqlite3.

Код рабочей среды

(int) GetArticlesCount
{
    int articlesCount = 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 ) 
        {
            if( sqlite3_step(statement) == SQLITE_ROW )
                articlesCount  = 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 articlesCount;
}