SQLite3数据库没有通过NSLog在控制台上显示条目(将数据保存到数据库工作)

时间:2012-03-31 15:33:31

标签: iphone objective-c ios sqlite console

使用简单的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 个答案:

答案 0 :(得分:1)

在每个数据库操作完成后放置NSLog(@"Error. '%s'", sqlite3_errmsg(database));。 (即;之后,sqlite3_step,sqlite3_prepare等)。当您从Library / ApplicationSupport .....获得由模拟器创建的数据库时,您可以使用终端打开它并查看内容。或者使用mozilla的SQLite Manager插件,您可以打开数据库并以图形方式查看内容。

答案 1 :(得分:0)

从查询中返回任何行吗?使用浏览器打开您的sqlite数据库(http://sqlitebrowser.sourceforge.net/)并检查数据是否实际保存。

然后在浏览器中重新运行您的sql以测试查询,最后打开一个断点 -(IBAction)showButton:(id)sender并逐步完成

答案 2 :(得分:0)

我的一个朋友刚刚意识到我犯了一个大错误,我完全忘了创建“TIMESTAMP”栏目,我试图在这里读出来。如果您查看以下行:"CREATE TABLE IF NOT EXISTS TIMINGS(ID INTEGER PRIMARY KEY AUTOINCREMENT, TIME INTEGER)";您看到我没有创建时间戳列。最后但并非最不重要的是TIMESTAMP是SQL中受保护的关键字,您不能使用它。要保存我刚创建的时间戳并重命名该列,现在它正在工作。感谢你的帮助。