好的,所以我不确定如何命名这个问题,但我可以解释一下我的问题。我正在创建一个webbrowser,并使用sqlite数据库来存储历史记录。当页面加载完我的方法时:
-(void)addHistory:(NSString*)title address:(NSString*)url{
sqlite3_stmt *statement;
const char *dbpath = [_databasePath UTF8String];
if (sqlite3_open(dbpath, &_historyDB) == SQLITE_OK)
{
NSString *updateSQL = [NSString stringWithFormat:
@"UPDATE HISTORY SET title='%@' WHERE url='%@'", title, url];
const char *update_stmt = [updateSQL UTF8String];
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(_historyDB, update_stmt, -1, &stmt, NULL)==SQLITE_OK) {
NSLog(@"Updated");
}else{
NSString *insertSQL =
[NSString stringWithFormat:
@"INSERT INTO HISTORY (title, url, visits, date, search) VALUES (\"%@\", \"%@\", \"%@\", \"%@\", \"%@\")",
title, url, @"todo", @"todo", [NSString stringWithFormat:@"%@ %@", title, url]];
const char *insert_stmt = [insertSQL UTF8String];
sqlite3_prepare_v2(_historyDB, insert_stmt,
-1, &statement, NULL);
if (sqlite3_step(statement) == SQLITE_DONE)
{
NSLog(@"Added Entry");
} else {
NSLog(@"Coundn't Add Entry");
}
sqlite3_finalize(statement);
}
sqlite3_close(_historyDB);
}
}
我假设如果更新失败(因为表中没有url),它将移动到else语句并添加密钥。这背后的主要思想是更新网页的标题,一旦工作,更新其他字段,如上次访问,查看的次数等等。
我已经尝试了各种不同的方法,但我似乎无法达到预期的效果。
答案 0 :(得分:0)
要执行update语句,必须为该语句调用sqlite3_step
。
要了解更新了多少条记录,请致电sqlite3_changes
。
您必须处理sqlite3_prepare_v2
来电所返回的任何错误。
您必须为sqlite3_finalize
致电stmt
。
任何网址或标题中包含'
的网站都会破坏您的SQL语句;要避免SQL injection attacks,请使用parameters。
答案 1 :(得分:0)
我最终切换到FMDB,这是SQLite的一个出色的Objective-C包装器。然后我执行了一个SELECT
语句,其中url与当前url匹配,如果它返回了我更新数据库的值,如果没有,我只是添加到它。