База данных SQLite3 не отображает записи на консоли через NSLog (сохранение данных в БД работает) - PullRequest
0 голосов
/ 31 марта 2012

Работа над простым приложением TimeTracker.Вы запускаете таймер, ждете определенное время, останавливаете часы и сохраняете потраченные минуты в базу данных SQLite3.Все работает, как и ожидалось, когда я нажимаю на Сохранить, я получаю подтверждение, что запись была сохранена, но я не могу получить сохраненные записи, отображаемые на консоли.Как видно на скриншоте ниже, у меня есть show button, который должен показать мне все мои сохраненные записи в консоли, включая отметку времени, но ничего не происходит, когда я нажимаю кнопку.

Я думаю, что проблема связана с поисковым запросом.но я не могу понять, в чем дело.

Насколько я понимаю, запрос ищет метку времени (столбец 0) и потраченные минуты (столбец 1), но это не работает, пожалуйста, помогите.

   NSLog(@"Timestamp: %s - Timing: %s", sqlite3_column_text(statement, 0), sqlite3_column_text(statement, 1));

База данных SQLite очень проста, я хочу сохранить только одно значение> потраченных минут.Может быть, база данных создана неправильно?

Создание базы данных:

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSString *docsDir;
    NSArray *dirPaths;

    dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    docsDir = [dirPaths objectAtIndex:0];

    databasePath = [[NSString alloc]initWithString:[docsDir stringByAppendingPathComponent:@"timings.db"]];

    NSFileManager *filemgr = [NSFileManager defaultManager];

    if ([filemgr fileExistsAtPath:databasePath] == NO) 
    {
        const char *dbPath = [databasePath UTF8String];

        if (sqlite3_open(dbPath, &timings) == SQLITE_OK) 
        {
            char *errormsg;
            const char *sql_stmt =
            "CREATE TABLE IF NOT EXISTS TIMINGS(ID INTEGER PRIMARY KEY AUTOINCREMENT, TIME INTEGER)";

            if (sqlite3_exec(timings, sql_stmt, NULL, NULL, &errormsg) != SQLITE_OK) 
            {
                self.statusLabel.text = @"Failed to create database";
            }
            sqlite3_close(timings);
        } 
        else 
        {
            self.statusLabel.text = @"Failed to open/create database.";
        }

    }
}

Показать сохраненные записи на консоли:

-(IBAction)showButton:(id)sender
{
    if (sqlite3_open([databasePath UTF8String], &timings) == SQLITE_OK)
    {
        NSString *queryStatement = [NSString stringWithFormat:@"SELECT TIMESTAMP, TIME FROM TIMINGS"];

        sqlite3_stmt *statement;
        if (sqlite3_prepare_v2(timings, [queryStatement UTF8String], -1, &statement, NULL) == SQLITE_OK)
        {
            while (sqlite3_step(statement) == SQLITE_ROW) {
                NSLog(@"Timestamp: %s - Timing: %s", sqlite3_column_text(statement, 0), sqlite3_column_text(statement, 1));
            }
            sqlite3_finalize(statement);
            sqlite3_close(timings);
        }
    }
}

Screernshot

Ответы [ 3 ]

1 голос
/ 01 апреля 2012

Поставить NSLog(@"Error. '%s'", sqlite3_errmsg(database)); после каждой операции с базой данных. (т.е. после sqlite3_step, sqlite3_prepare и т. д.). Когда вы получаете базу данных, созданную симулятором, из Library / ApplicationSupport ....., вы можете открыть ее с помощью терминала и просмотреть ее содержимое. Или с помощью плагина SQLite Manager от mozilla вы можете открыть базу данных и просмотреть содержимое в графическом виде.

0 голосов
/ 02 апреля 2012

мой друг только что понял, что совершил большую ошибку, я совершенно забыл СОЗДАТЬ столбец «TIMESTAMP», который я пытаюсь прочитать здесьЕсли вы посмотрите на эту строку: "CREATE TABLE IF NOT EXISTS TIMINGS(ID INTEGER PRIMARY KEY AUTOINCREMENT, TIME INTEGER)"; Вы увидите, что я не создал столбец метки времени.И последнее, но не менее важное: TIMESTAMP - защищенное ключевое слово в SQL, которое вам запрещено использовать.Чтобы сохранить метку времени, я только что создал и переименовал столбец, и теперь он работает.Спасибо за вашу помощь.

0 голосов
/ 01 апреля 2012

Получены ли какие-либо строки из вашего запроса?Откройте базу данных sqlite с помощью браузера (http://sqlitebrowser.sourceforge.net/) и убедитесь, что данные действительно сохраняются.

Затем повторно запустите SQL в браузере, чтобы протестировать запрос, и, наконец, установите точку останова на -(IBAction)showButton:(id)sender и выполните шаг

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...