使用简单的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);
}
}
}
答案 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中受保护的关键字,您不能使用它。要保存我刚创建的时间戳并重命名该列,现在它正在工作。感谢你的帮助。