Iphone SQLite3数据库未通过NSLog在控制台上显示条目(将数据保存到DB works)
正在开发一个简单的时间跟踪器应用程序。启动计时器,等待特定时间,停止时钟,并将花费的分钟数保存到SQLite3数据库。一切都按预期进行,当我点击save(保存)时,我得到一个确认,即记录已保存,但我无法获得控制台上显示的已保存条目。如下面的屏幕截图所示,我有一个Iphone SQLite3数据库未通过NSLog在控制台上显示条目(将数据保存到DB works),iphone,objective-c,ios,sqlite,console,Iphone,Objective C,Ios,Sqlite,Console,正在开发一个简单的时间跟踪器应用程序。启动计时器,等待特定时间,停止时钟,并将花费的分钟数保存到SQLite3数据库。一切都按预期进行,当我点击save(保存)时,我得到一个确认,即记录已保存,但我无法获得控制台上显示的已保存条目。如下面的屏幕截图所示,我有一个show按钮,它应该会在控制台中显示我保存的所有条目,包括时间戳,但当我点击按钮时,什么都不会发生 我认为问题与搜索查询有关,但我不知道我们出了什么问题 据我所知,该查询正在查找时间戳(第0列)和花费的分钟数(第1列),但不起作用,请提供
show按钮
,它应该会在控制台中显示我保存的所有条目,包括时间戳,但当我点击按钮时,什么都不会发生
我认为问题与搜索查询有关,但我不知道我们出了什么问题
据我所知,该查询正在查找时间戳(第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);
}
}
}
您的查询是否返回了任何行?使用浏览器打开sqlite数据库(http://sqlitebrowser.sourceforge.net/)并检查数据是否已实际保存 然后在浏览器中重新运行sql以测试查询,最后在
-(iAction)showButton:(id)发送方
和单步执行PutNSLog(@“错误”。%s',sqlite3_errmsg(数据库))代码>在每个数据库操作完成后。(即:之后,sqlite3\u步骤,sqlite3\u准备等)。当您从Library/ApplicationSupport…获取由模拟器创建的数据库时,您可以使用终端打开该数据库并查看内容。或者使用mozilla的SQLite管理器插件,您可以打开数据库并以图形方式查看内容 我的一个朋友刚刚意识到我犯了一个大错误,我完全忘了创建我试图在这里读出的“TIMESTAMP”列。如果您查看这一行:“如果不存在,则创建表计时(ID INTEGER主键自动递增,TIME INTEGER)”代码>您可以看到我没有创建时间戳列。最后但并非最不重要的是,时间戳是SQL中不允许使用的受保护关键字。为了保存时间戳,我刚刚创建并重命名了列,现在它开始工作了。谢谢你的帮助 你确定showButton被呼叫了吗?将NSLog(@“in showButton”)放在其开头以确保。是,将调用showButton。在开头放一个NSLog。控制台输出:2012-04-01 09:54:19.982 RangeManager[49985:f803]显示按钮点击此[链接][1][1]:我的iPhone模拟器SQLite3数据库存储在哪里?找不到以下文件夹:/User/Library/Application Support/iPhone Simulator/4.2/Applications/GUID/Documents>我拥有的是:/User/Library/Application Support,但没有名为iPhone Simulator的子文件夹。最终找到了该文件夹。必须首先通过终端删除隐藏标志:chflags nohidden/users/[username]/library能够使用SQL浏览器验证应用程序是否成功保存数据。当我在IBAction showButton上设置断点时,我没有看到任何奇怪的行为,但我的查询中仍然没有列出任何行。控制台上甚至没有显示while中的附加NSLog。当我在while函数前放置NSLog时,我看到一个输出。使用sqlite浏览器在数据库上运行查询“选择时间戳,计时时间”,它是否返回结果?奇怪的是,当我运行:选择时间戳,计时时间>我得到:没有这样的列:时间戳。。。当我运行时:选择TIME FROM TIMINGS>I get my saved records List(无时间戳)NSLog(@“Error.”%s',sqlite3_errmsg(database));这是非常有用的。谢谢